助記詞的實現
別人的庫多半都是只實現了部分功能,所以fork了人家的源碼,在此基礎上增加了實用功能,保證通過助記詞恢復和對助記詞的校驗,避免了因隨意輸入助記詞便可恢復成私鑰的過程。原作者的實現并非十分高效,但接口很直觀,該有的功能很全面,做法有很多,開源能使它更好。僅當學習。
https://github.com/alphaqiu/mnemonic
BIP39是助記詞標準的實現,助記詞是一個隨機數的字序列,用來作為種子產生一個確定性的錢包。單詞序列足以重新創建種子,然后再創建錢包和所有派生的密鑰。一個實現帶有助記詞的確定性錢包應用程序在首次創建錢包時將向用戶顯示12到24個單詞的序列。該單詞序列是錢包備份,可用于恢復和重新創建相同或任何兼容的錢包應用程序中的所有密鑰。記憶單詞使用戶更容易備份錢包,因為與隨機數字序列相比,它們易于閱讀和正確地轉錄。所有的助記詞在這里可以查看:助記詞詞庫。
使用BIP39中定義的標準化過程,錢包自動生成助記詞。錢包從一個熵源開始,添加一個校驗和,然后將熵映射到一個單詞列表,具體步驟如下:
- 創建128到256位的隨機序列(熵)。
- 通過獲取SHA256哈希的第一(熵長度/ 32)位來創建隨機序列的校驗和。
- 將校驗和添加到隨機序列的末尾。
- 將序列分成11位的部分。
- 將每個11位值映射到來自2048個單詞的預定義字典中的單詞。
- 助記詞是單詞序列。 生成助記詞的步驟如下圖。
下表描述了初始熵長度(ENT),校驗和長度(CS)和單詞中生成的助記詞(MS)的長度之間的關系。
從助記詞到種子
用戶可以決定用密碼來保護他們的助記符。如果不存在密碼短語,則使用空字符串“”。
助記詞代表長度為128到256位的熵。然后使用熵通過使用密鑰擴展函數PBKDF2來導出更長(512位)的種子。然后,所產生的種子用于構建確定性錢包并獲得其密鑰。
密鑰擴展功能有兩個參數:助記詞和鹽(salt)。密鑰擴展功能中的鹽的目的是使得難以構建能夠進行暴力攻擊的查找表。在BIP-39標準中,salt具有另一個目的 - 它允許引入密碼短語作為保護種子的額外安全因子。
- PBKDF2密鑰擴展功能的第一個參數是從步驟6產生的助記詞。
- PBKDF2密鑰擴展功能的第二個參數是salt。salt由字符串常量“mnemonic”和可選的用戶提供的密碼短語字符串組成。
- PBKDF2使用2048輪HMAC-SHA512哈希算法來擴展助記詞和salt參數,產生512位值作為其最終輸出。那個512位的值就是種子。 使用助記詞來生成種子的步驟如下圖。