知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
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
這個BIP描述了使用助記碼或者助記句子(簡稱助記詞)--一組便于記憶的單詞來生成確定性錢包。
這個BIP由兩部分構成:生成助記詞和把生成的助記詞轉化成一個二進制種子。這個種子後面會更急類似於BIP32的方法生成確定性錢包。
與處理原始的二進制或者十六進制的錢包種子相比,在人機交互過程中助記詞是更勝一籌的。這些助記單詞可以被寫在紙上或者通過電話說出來。
本指南旨在通過人類可讀的轉錄來傳輸計算機生成的隨機性。並不是將用戶創建的句子(也稱為腦錢包)處理到錢包種子中的方法。
助記符必須以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
理想的單詞列表具有以下特點:
智能選詞
單詞列表以這種方式創建:輸入前四個字母來就足以明確地標識這個單詞;
避免相似的單詞
"build" and "built", "woman" and "women", or "quick" and "quickly" 這樣的詞對,不僅使記憶困難,而且更容易出錯,更難猜到;
排序的單詞列表
排序的單詞列表允許更有效地查找代碼字(即,實現可以使用二分搜索而不是線性搜索)
這也允許使用字典樹(首碼樹),例如用於更好的壓縮
單詞表可以包含本土字元,但必須使用規範化形式兼容性分解(NFKD)以UTF-8編碼。
用戶可以決定用密碼保護他們的助詞。如果密碼不存在,則使用空字元串“”代替。
要通過助記詞創建一個二進制種子,我們使用助記符作為密碼(UTF-8 NFKD)和字元串“mnemonic”+ passphrase 作為鹽(再次以UTF-8 NFKD)來調用PBKDF2函數。迭代計數設置為2048,HMAC-SHA512用作偽隨機函數。派生密鑰的長度為512位(= 64位元組)。
該種子可以隨後用於使用BIP-0032或類似方法產生確定性錢包。
助記詞轉換為二進制種子完全獨立於生成這個助記詞。這導致相當簡單的代碼; 助記詞結構沒有約束,客戶可以自由地實現自己的單詞列表,甚至是整個助記詞的生成器,允許字典列表中的輸入錯誤檢測或其他用途的靈活性。
雖然使用的助記詞可能不是通過“生成助記詞”部分中描述的算法生成的,但這是不建議的,軟件必須使用單詞表計算助記詞的校驗和,如果無效則發出警告。
所描述的方法還提供似乎可信的可否認性,因為每個密碼短語產生一個有效的種子(因此產生確定性錢包),但是只有正確的那一個才能使所需的錢包可用。
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。
Wordlists
English https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Japanese https://github.com/bitcoin/bips/blob/master/bip-0039/japanese.txt
Korean https://github.com/bitcoin/bips/blob/master/bip-0039/korean.txt
Spanish https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt
Chinese (Simplified) https://github.com/bitcoin/bips/blob/master/bip-0039/chinese_simplified.txt
Chinese (Traditional) https://github.com/bitcoin/bips/blob/master/bip-0039/chinese_traditional.txt
French https://github.com/bitcoin/bips/blob/master/bip-0039/french.txt
Italian https://github.com/bitcoin/bips/blob/master/bip-0039/italian.txt
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
HD Wallet 採用 2048 個單詞,或者漢字作為助記詞,這些詞庫對外公開,很多錢包僅僅使用path第一個地址並且沒有加密。如果你知道某個用戶的助記詞中的11各詞的排列順序,那麼我們就可以通過窮舉方法,算出所有地址的私鑰,如果碰巧找到了已經在使用的地址。就可以將裡面的ETH全部轉走。
為了增加 HD Wallet 的安全,我做了一個詞庫,這個詞庫不對外公開,並且使用的漢字均是不常用漢字。只能複製粘貼,几乎很難使用輸入法輸入該漢字。
同時path 還做了分層,和索引地址。分層採用時間維度,索引採用隨機數, Seed 做加密處理。助記詞共 15 個漢字。
效果如下
漢字助記詞:欈 戀 髎 響 麢 戵 邎 蠢 鶖 躒 蠈 鰘 譥 趲 巆 地址:0x4949225eab0121d1e0b0eeb286a12b04ff596471 私鑰:b5ce4ac958fbdcd385d6ae850c1870c6da7b990981363c25036a31ba06be6636 漢字助記詞:霼 彎 曤 纀 鸇 鷔 鶹 纚 鱱 讁 艣 鼴 黭 纒 贛 地址:0x430097d16819108068a7af22a116285e54bc3e6b 私鑰:3b78431a43a2c69e861870f0eff1d54d3965247ca5e588a9f907904f9ea5b822 漢字助記詞:聾 鱦 驥 鬘 鰕 蘲 韃 鏻 雤 鑀 瓤 蘣 壥 躠 罋 地址:0x641fd58728cf08bc8795d41cfd3885a4f1c8dced 私鑰:b7c2ff2a39e3a534e6e89288b05b4a283b10b34b2dfca2b336676729c7a68ad1 漢字助記詞:轕 鶼 瀝 钁 麝 鸑 灙 纞 躐 嚹 櫞 鱁 贑 癠 躤 地址:0xae6ad7cf3e31556bc7262e25fba2ebad9954d08b 私鑰:c989fe5c108b0bd33e5731919e09c30c639a4ff29fb4e66fe3052975855181f6 漢字助記詞:鰵 鐗 鱇 彏 鱞 鷮 鼯 矃 曟 鬙 衢 斅 櫜 鸒 襨 地址:0x7fc6bca55c51ab3b4266d8f67d63c196ac874d93 私鑰:53e755075653a64867f885e702ca0a2612bdd13ec2bed0df647bf568a639bc46