跟大家一起學習區塊鏈技術系列之一 比特幣之錢包(5)加固密鑰

加固密鑰

加固擴展密鑰解決了普通擴展密鑰潛在的問題。如果一個攻擊者得到了一個普通的父鏈碼和父公鑰,他可以暴力算出由他們得到的所有鏈碼。如果攻擊者也得到了子、孫、進一步繼承的私鑰,他就可以用鏈碼生成由這個私有繼承來的所有擴展私鑰。如下圖所示,

跟大家一起學習區塊鏈技術系列之一 比特幣之錢包(5)加固密鑰

可能更糟,攻擊者可以顛倒普通的子私鑰的推導公式並通過減去父鏈碼來恢復父私鑰,如圖中所示的子代和父代情況。這意味著獲得擴展公鑰和任意從它繼承來的私鑰的攻擊者恢復公鑰對應的私鑰和從它繼承的所有的密鑰。

因此,擴展公鑰的鏈碼部分要比標準的公鑰更安全的保護起來,用戶不要在任意可能不安全的環境下導出非擴展私鑰。

這個問題可以解決,通過一些平衡,用加固的密鑰推導公式來代替普通的密鑰推導公式。

普通的密鑰推導公式,如上節所描述的,組合索引號、父鏈碼和父公鑰一起創建子鏈碼,並且這個整數值和父私鑰一起組合創建了子私鑰。

跟大家一起學習區塊鏈技術系列之一 比特幣之錢包(5)加固密鑰

加固公式,如上圖,組合索引號,父鏈碼,父私鑰一起創建用於生成子鏈碼和子私鑰的數據。這個公式使得在不知道父私鑰的情況下不可能生成子公鑰。換句話說,父擴展公鑰不能創建加固的子公鑰。

因為這樣,一個加固的擴展私鑰沒有普通的擴展私鑰有用-然而,加固的擴展私鑰卻創建了防火牆,使得多層密鑰推導洩露不會發生。因為加固子擴展公鑰自己不能產生孫鏈碼,父擴展公鑰和孫私鑰同時洩露,不能推導出重孫擴展私鑰。

HD協議使用不同的索引號來表明生成普通還是加固密鑰。索引號從0到0x7fffffff將生成普通密鑰。索引號從0x80000000到0xffffffff將生成加固密鑰。為了簡單描述,很多開發者用撇表明加固密鑰,所以第一個普通密鑰是0,第一個加固密鑰是0´ 。

(比特幣開發者經常用ASCII碼的撇號,而不用unicode的撇號)

這個約定的描述進一步用斜線加m或M的前綴組合表示層級和密鑰類型,m代表私鑰,M代表公鑰。比如,m/0´/0/122´表示主私鑰的第一個加固兒子的第一個普通兒子的第123個加固密鑰。下面層級圖圖示了撇號和加固密鑰防火牆。

跟大家一起學習區塊鏈技術系列之一 比特幣之錢包(5)加固密鑰

錢包遵從BIP32 HD協議僅僅創建主私鑰(m)的加固孩子,防止主密鑰洩露後導致子密鑰的洩露。因為主密鑰沒有普通孩子,主公鑰在HD錢包是不用的。所有其他的密鑰可以有普通孩子,所以用相應的擴展公鑰來代替使用。

HD協議也描述了擴展公鑰和擴展私鑰的序列化格式。細節的話請看BIP32全部的HD協議規範。


分享到:


相關文章: