Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

1.19. BIP39協議:使用助記詞生成確定性錢包



BIP:39
層:應用層
標題:使用助記詞生成確定性錢包秘鑰
作者:Marek Palatinus <slush@satoshilabs.com>
     Pavol Rusnak <stick@satoshilabs.com>
     Aaron Voisine <voisine@gmail.com>
     Sean Bowe <ewillbefull@gmail.com>
狀態:已經被提議
類型:標準化跟蹤
創建日期:2013-09-10
譯者:kimziv

1.19.1. 摘要

這個BIP描述了使用助記碼或者助記句子(簡稱助記詞)--一組便于記憶的單詞來生成確定性錢包。

這個BIP由兩部分構成:生成助記詞和把生成的助記詞轉化成一個二進制種子。這個種子後面會更急類似於BIP32的方法生成確定性錢包。

1.19.2. 動機

與處理原始的二進制或者十六進制的錢包種子相比,在人機交互過程中助記詞是更勝一籌的。這些助記單詞可以被寫在紙上或者通過電話說出來。

本指南旨在通過人類可讀的轉錄來傳輸計算機生成的隨機性。並不是將用戶創建的句子(也稱為腦錢包)處理到錢包種子中的方法。

1.19.3. 生成助記詞

助記符必須以32位的倍數編碼熵。隨着熵的安全性提高,同時句子的長度也在增加。我們將初始熵長度稱為ENT。ENT允許的大小為128-256位。

首先,生成ENT位的初始熵。通過取第一個生成的校驗和



ENT/32

它的SHA256哈希的位。該校驗和附加到初始熵的末尾。接下來,這些連接的比特位被分成多個11位的組,每個組用從0-2047的數字編碼,用作單詞表的索引。最後,我們將這些數字轉換為單詞,並將加入的所有單詞組成助記句。

下表描述了初始熵長度(ENT),校驗和長度(CS)和生成助記詞(MS)的長度之間的關係。



CS = ENT / 32
MS = (ENT + CS) / 11

			
ENT		CS		ENT + CS	MS
------------------------------
128		4		132			12
160		5		165			15
192		6		198			18
224		7		231			21
256		8		264			24			
			
			

1.19.4. 單詞表

理想的單詞列表具有以下特點:

  • 智能選詞

    單詞列表以這種方式創建:輸入前四個字母來就足以明確地標識這個單詞;

  • 避免相似的單詞

    "build" and "built", "woman" and "women", or "quick" and "quickly" 這樣的詞對,不僅使記憶困難,而且更容易出錯,更難猜到;

  • 排序的單詞列表

    排序的單詞列表允許更有效地查找代碼字(即,實現可以使用二分搜索而不是線性搜索)

    這也允許使用字典樹(首碼樹),例如用於更好的壓縮

單詞表可以包含本土字元,但必須使用規範化形式兼容性分解(NFKD)以UTF-8編碼。

1.19.5. 從助記詞到種子

用戶可以決定用密碼保護他們的助詞。如果密碼不存在,則使用空字元串“”代替。

要通過助記詞創建一個二進制種子,我們使用助記符作為密碼(UTF-8 NFKD)和字元串“mnemonic”+ passphrase 作為鹽(再次以UTF-8 NFKD)來調用PBKDF2函數。迭代計數設置為2048,HMAC-SHA512用作偽隨機函數。派生密鑰的長度為512位(= 64位元組)。

該種子可以隨後用於使用BIP-0032或類似方法產生確定性錢包。

助記詞轉換為二進制種子完全獨立於生成這個助記詞。這導致相當簡單的代碼; 助記詞結構沒有約束,客戶可以自由地實現自己的單詞列表,甚至是整個助記詞的生成器,允許字典列表中的輸入錯誤檢測或其他用途的靈活性。

雖然使用的助記詞可能不是通過“生成助記詞”部分中描述的算法生成的,但這是不建議的,軟件必須使用單詞表計算助記詞的校驗和,如果無效則發出警告。

所描述的方法還提供似乎可信的可否認性,因為每個密碼短語產生一個有效的種子(因此產生確定性錢包),但是只有正確的那一個才能使所需的錢包可用。

1.19.6. 單詞列表

https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md

如果一個 HD 錢包助記詞是 12 個單詞,一共有 2048 個單詞可能性,如何算出隨機的生成的助記詞可能性是一個排列問題,根據公式: n!/( n - r )! ,既 2048!/(2048-12)! = 5.2715379713014884760003093175282e+39。

1.19.7. 開發庫

1.19.7.3. 其他實現

				
Elixir: https://github.com/izelnakri/mnemonic

Objective-C: https://github.com/nybex/NYMnemonic

Haskell: https://github.com/haskoin/haskoin

.NET C# (PCL): https://github.com/Thashiznets/BIP39.NET

.NET C# (PCL): https://github.com/NicolasDorier/NBitcoin

JavaScript: https://github.com/bitpay/bitcore-mnemonic, https://github.com/bitcoinjs/bip39 (used by blockchain.info)

Ruby: https://github.com/sreekanthgs/bip_mnemonic

Rust: https://github.com/infincia/bip39-rs

Swift: https://github.com/CikeQiu/CKMnemonic

C++: https://github.com/libbitcoin/libbitcoin/blob/master/include/bitcoin/bitcoin/wallet/mnemonic.hpp

C (with Python/Java/Javascript bindings): https://github.com/ElementsProject/libwally-core				
				
				

1.19.8. Netkiller 助記詞詞庫

HD Wallet 採用 2048 個單詞,或者漢字作為助記詞,這些詞庫對外公開,很多錢包僅僅使用path第一個地址並且沒有加密。如果你知道某個用戶的助記詞中的11各詞的排列順序,那麼我們就可以通過窮舉方法,算出所有地址的私鑰,如果碰巧找到了已經在使用的地址。就可以將裡面的ETH全部轉走。

為了增加 HD Wallet 的安全,我做了一個詞庫,這個詞庫不對外公開,並且使用的漢字均是不常用漢字。只能複製粘貼,几乎很難使用輸入法輸入該漢字。

同時path 還做了分層,和索引地址。分層採用時間維度,索引採用隨機數, Seed 做加密處理。助記詞共 15 個漢字。

效果如下

			
漢字助記詞:欈 戀 髎 響 麢 戵 邎 蠢 鶖 躒 蠈 鰘 譥 趲 巆
地址:0x4949225eab0121d1e0b0eeb286a12b04ff596471
私鑰:b5ce4ac958fbdcd385d6ae850c1870c6da7b990981363c25036a31ba06be6636

漢字助記詞:霼 彎 曤 纀 鸇 鷔 鶹 纚 鱱 讁 艣 鼴 黭 纒 贛
地址:0x430097d16819108068a7af22a116285e54bc3e6b
私鑰:3b78431a43a2c69e861870f0eff1d54d3965247ca5e588a9f907904f9ea5b822

漢字助記詞:聾 鱦 驥 鬘 鰕 蘲 韃 鏻 雤 鑀 瓤 蘣 壥 躠 罋
地址:0x641fd58728cf08bc8795d41cfd3885a4f1c8dced
私鑰:b7c2ff2a39e3a534e6e89288b05b4a283b10b34b2dfca2b336676729c7a68ad1

漢字助記詞:轕 鶼 瀝 钁 麝 鸑 灙 纞 躐 嚹 櫞 鱁 贑 癠 躤
地址:0xae6ad7cf3e31556bc7262e25fba2ebad9954d08b
私鑰:c989fe5c108b0bd33e5731919e09c30c639a4ff29fb4e66fe3052975855181f6

漢字助記詞:鰵 鐗 鱇 彏 鱞 鷮 鼯 矃 曟 鬙 衢 斅 櫜 鸒 襨
地址:0x7fc6bca55c51ab3b4266d8f67d63c196ac874d93
私鑰:53e755075653a64867f885e702ca0a2612bdd13ec2bed0df647bf568a639bc46