本文主要從技術(shù)實現(xiàn)角度講解數(shù)字貨幣錢包該怎樣去保護(hù)用戶私鑰。
0x01 理解數(shù)字貨幣錢包
對于數(shù)字貨幣錢包來說,它并不是裝錢的,而是裝密鑰的工具,準(zhǔn)確來說,就是裝私鑰的工具。有了私鑰就可以擁有根據(jù)其對應(yīng)公鑰計算出的地址上的數(shù)字貨幣的支配權(quán)。
作為錢包開發(fā)者,如何存儲和使用用戶私鑰便是錢包安全的關(guān)鍵所在。
0x02 私鑰的加密存儲
下面是使用imToken錢包App創(chuàng)建錢包的截圖。從截圖上可以清楚的看到我們在錢包的時候需要輸入密碼來保護(hù)私鑰。那這個私鑰究竟是如何被保護(hù)的呢?私鑰的生成和輸入的密碼有沒有關(guān)系呢?

這里一般有兩種誤解:
- 根據(jù)輸入的密碼生成私鑰
- 使用輸入的密碼對私鑰直接進(jìn)行加密,然后將加密的內(nèi)容存到自己手機(jī)上。
如果錢包應(yīng)用開發(fā)者真的這么做的話,估計大家每天都是排著隊丟幣了 :)。
你想啊,如果是第一種情況,那如果兩個人用同樣的密碼不就可以互相看到對方錢包了么。
如果是第二種情況,在你輸入密碼進(jìn)入錢包應(yīng)用后,私鑰就要被加載并駐留在內(nèi)存里。你在網(wǎng)上搜一下“從內(nèi)存提取密碼工具”,保證可以搜到一大把。另外一個風(fēng)險是,用戶輸入的密碼都不是太長并且很多時候有規(guī)律可循,這樣當(dāng)加密后的私鑰數(shù)據(jù)泄漏后,黑客通過暴力破解結(jié)合彩虹表等工具將私鑰破解的幾率還是比較高的。
事實上,私鑰的生成永遠(yuǎn)和你輸入的密碼沒有半毛錢關(guān)系,要么是隨機(jī)生成,要么是根據(jù)助記符(一串隨機(jī)生成的英文或其它語言詞組)生成,保證每個人的私鑰都是唯一的。
私鑰的加密過程一般來說是下面這樣的:
第一步:錢包應(yīng)用會生成一個32字節(jié)隨機(jī)數(shù),我們稱之為主密鑰。
第二步:使用用戶輸入的密碼對主密鑰加密,生成主密鑰密文。
第三步:使用主密鑰對錢包私鑰進(jìn)行加密,生成私鑰密文。
第四步:清除主密鑰和私鑰,保留主密鑰密文和私鑰密文。
你可以會有疑問,這樣黑客拿到密文后先暴力破解主密鑰,再破解私鑰不也很容易么?其實在具體實現(xiàn)的時候,每個密文在生成的時候不只是用輸入的密碼,還有相應(yīng)的密文生成參數(shù),想通過密文和密碼直接解密得到明文沒那么容易的。
0x03 私鑰的使用
從上一部分的解釋我們知道,錢包應(yīng)用里保存的是主密鑰密文和私鑰密文。
當(dāng)我們登錄錢包后,錢包應(yīng)用會通過我們輸入的密碼對主密鑰密文解密,將解密后的主密鑰駐留內(nèi)存。
當(dāng)我們進(jìn)行轉(zhuǎn)賬等需要私鑰簽名的操作時,通過主密鑰解密私鑰密文得到私鑰,使用后立即將私鑰從內(nèi)存清除。
當(dāng)我們需要修改密碼時,實際上只是修改了主密鑰密文,并不會觸碰私鑰相關(guān)部分。
這樣,基本上將私鑰明文暴露的幾率降到最低,最大限度的保證私鑰的安全。
還有疑問?歡迎加入我的知識星球,盡我所能為你答疑解惑。