如何生成唯一key 以太坊二層賬戶金鑰生成指南

2021-10-16 01:11:54 字數 1988 閱讀 4478

最近,loopring exchange發生了一起因前端漏洞引發的安全事件,導致中繼服務緊急停止。所有使用者在交易前需要更新其eddsa金鑰對。有關該錯誤的完整說明請參見starkware的部落格[1]。

幸運的是,事件並未造成損失。然而,關於弱私鑰的漏洞屢屢發生,由於使用不當而造成大量損失。據weird[2],由於使用「腦錢包」(一種不正確的方法來生成私鑰),超過2800個位元幣和40,000個以太幣被盜。但在loopring事件中情況略有不同。出現風險的是用於zkrollup的新金鑰,而不是以太坊賬戶的金鑰,或者如starkware所說,這是乙個賬戶金鑰。以太坊金鑰仍然處於安全狀態。為什麼需要賬戶金鑰而不是使用以太坊金鑰?如何安全地生成和儲存它?

為什麼我們需要乙個賬戶金鑰?

zkrollup增強了以太坊的可擴充套件性,同時安全性仍保持在l1級別。與新手使用者不同,zkrollup的使用者很可能已經擁有乙個以太坊賬戶。為什麼仍需要乙個賬戶金鑰?主要有三個原因。

1.snark友好賬戶金鑰需要對snark友好。與以太坊金鑰不同,它使用不同的橢圓曲線(例如ed25519,取代secp256k1)。通常,eddsa金鑰用於簽署鏈下請求,因為它對snark更為友好。但是,因為私鑰的長度相同,仍然可以使用與以太坊金鑰相同的私鑰,但顯然對應的公鑰是不同的。

2.相容智慧型合約賬戶由於中繼器需要簽名來檢查鏈下交易的有效性並生成證明,因此它不適用於合同賬戶。最佳實踐是使用以太坊賬戶授權建立乙個新的金鑰對,這樣對外部賬戶和合約賬戶都適用。

3.風險隔離鏈下簽名帶來了新的安全風險。如果以太坊金鑰用於zkrollup,則賬戶金鑰的洩漏意味著以太坊帳戶不再安全。使用不同的賬戶金鑰可以隔離風險,即使賬戶金鑰被盜或丟失,以太坊金鑰也可以保持安全。

如何生成賬戶金鑰?

私鑰必須完全隨機且不可**,並且金鑰空間應足夠大。因此,問題似乎等同於生成隨機數。這看似可行,但並非那麼容易,因為這需要收集足夠的雜訊。但是,如果以太坊賬戶已經存在,我們可以使用多種方法來確定性地從以太坊賬戶生成乙個賬戶金鑰。

1.使用以太坊賬戶簽名簡單來說,我們可以通過指定簽名從私鑰生成賬戶金鑰。如vitalik[3]所述,account_key = ecdsa_sign(private_key,「 42」)。可使用有意義的訊息代替「 42」,以警告使用者他在做什麼,例如「簽署此訊息以登入***。」。如果以太坊賬戶是合約賬戶,則將使用eip-1271來檢查有效性。

2.對簽名進行雜湊matter labs的聯合創始人alex gluchowski改進了vitalik的建議[4],account_key = sha256(ecdsa_sign(private_key, 「sign this message to login to service xyz」))。他強調說:「從密碼分析的角度來看,sha256(或另乙個偽隨機雜湊)很重要:簽名是橢圓曲線的點,因此我們需要打破兩個金鑰之間的任何潛在關係。」實際上,這種方法已在zksync中使用。

這看起來類似簡化版的pbkdf2[5]協議。但是,我希望對此有更正式的安全分析或證明,因為近來的一些研究成果指出基於雜湊的mac存在安全風險。

3.loopring的新方法在最新的文章[6]中,loopring提出了一種生成賬戶金鑰的新方法。loopring採納了alex和vitalik的建議。此外,引入了計數器n,這樣使用者更新賬戶金鑰時,可以確定性地產生不同的私鑰。

總而言之,我們可以借助數字簽名、偽隨機預言機和計數器等技術手段,從以太坊賬戶中獲得乙個賬戶金鑰。賬戶金鑰是唯一且確定的。不過,你仍然可以選擇生成乙個隨機數作為私鑰。

如何管理賬戶金鑰?

如果使用確定性的方式生成賬戶金鑰,則不需要額外的手段來管理賬戶金鑰。當我們需要為rollup交易簽名時,只需即時從以太坊賬戶中計算出賬戶金鑰。以太坊金鑰仍由數字貨幣錢包管理,這不會引入金鑰管理中的額外安全風險。

結論我們可以確定性的方式從以太坊賬戶中生成乙個賬戶金鑰。賬戶金鑰的安全級別可以與以太坊金鑰相同。加密錢包需要支援更多的加密原語,以提供更好的安全基礎架構。

以太坊合約位址是如何生成的

我們在以太坊上建立乙個合約時,新生成的合約的位址是根據傳送者 sender 的位址和其已生成的事務數 nonce 確定的,經過rlp編碼後再hash keccak 256 運算得出的。具體的nodejs 如下 var util require ethereumjs util 根據傳送者位址和nonc...

Dictionary的key如何確定唯一的

之前看過其他關於dictionary的key如何保證唯一的文章,大多的意思是根據記憶體的位址來確定,有一次的專案中,我以自定義的attribute作為key來儲存時發現,具有不同值的attribute作為key插入到dictionary時覆蓋了其他的物件。經過debug,發現,被覆蓋的物件有乙個特性...

如何使用PHP生成以太坊錢包和金鑰對?

本文將提供有關如何生成ecdsa私鑰的指南,然後使用php7.0 匯出到以太坊錢包位址。你可以找到以下工作實現 composer.json generateethereumwallet.php require once vendor autoload.php use sop cryptotypes ...