關於比特幣大腦錢包密碼多輪 SHA-256 的問題……
我試圖想出一種記憶種子的方法,這種方法可能會導致任意數量的比特幣大腦錢包。我需要多個錢包,因為 a) 我不希望我所有的雞蛋都放在一個籃子裡,b) 我希望能夠不時進口少量的雞蛋。
假設我想出了一個密碼,並假設它足夠長以確保安全。如果我要在片語的末尾連接一個值,並且每次都增加這個值,它可能會導致無限數量的腦錢包,即。
SHA256(passphrase.'1') SHA256(passphrase.'2') etc...
我看到這種方法的唯一缺點是,如果有人在未來的某個時候偶然發現了私鑰的種子(鍵盤記錄器、暴力破解等),那麼訪問所有其他錢包將是微不足道的。
所以我正在考慮使用兩輪 SHA256,但在第一輪的雜湊值中添加第二個片語,如下所示 -
SHA256(SHA256(passphrase.'1').'second phrase') SHA256(SHA256(passphrase.'2').'second phrase')
我會使用生成的雜湊作為大腦錢包的輸入。
這意味著將 ASCII 文本連接到第一個 SHA256 操作的十六進制。我不想使用實際數值的原因是我需要可以通過 unix 命令行輕鬆完成的操作(我不確定如何進行 256 位數學運算)。我不希望涉及任何自定義軟體,因為我的大腦沒有那麼多空間。這有望消除有人可以對我生成大腦錢包的過程進行逆向工程的擔憂。
我擔心如果我使用 ASCII 文本生成第二個密鑰,我會以某種方式損害 SHA256 程序並使一切變得不那麼安全。
我有理由擔心還是我的方法安全?
這有望消除有人可以對我生成大腦錢包的過程進行逆向工程的擔憂。
根據Kerckhoffs 的原則,你應該假設對手已經知道算法,唯一未知的就是密鑰——在你的例子中是密碼片語。
因此,根據定義,對手知道您正在生成大腦錢包密碼 $ w_i = h( h(k_1 || i) || k_2) $ (在哪裡 $ h(x) $ 是這樣的 $ Hex(SHA2(ASCII(x))) $ . 所以你的攻擊者唯一需要“逆向工程”的就是兩個密碼 $ k_1 $ 和 $ k_2 $ .
目前,假設 SHA-2 是抗原像的,這意味著找到的最佳方法是 $ k_1 $ 和 $ k_2 $ 就是簡單地猜測它們,看看結果是否與任何擷取的輸出匹配(或者,如果沒有擷取的輸出,看看結果是否有助於解鎖你的任何錢包)。
產生不同的 $ w_i $ 使用相同的密碼片語並不能顯著幫助攻擊者破解它,但如果他破解了一個密碼,其他所有密碼也會被破解。編碼(十六進制,ascii,其他任何東西)也對安全性無關緊要。
如果你的兩個密碼是好的(即有超過 100 位的熵一起),攻擊者幾乎沒有機會用這種蠻力成功。
如果您的密碼不正確(這包括所有少於 10 個字元的密碼,或者可以在字典中找到的更長的密碼),您的推導很容易被暴力破解。此外,如果其他使用者也使用您的方案,並且碰巧擁有相同的密碼,他們將擁有相同的密碼 $ w_i $ s,它可能被攻擊者使用。
您的方案可以通過使用慢速密碼雜湊來改進,並包括您獨有的鹽輸入,例如您的電子郵件地址。然後您可以使用計數器處理此慢速雜湊的輸出以獲得實際的 $ w_i $ .
如果攻擊者擁有鍵盤記錄器並擷取了您的密碼,那麼一切都已經失去。