在區塊鏈系統中,由於沒有中心化機構負責管理備份使用者敏感資料,使用者私鑰的生成、儲存、使用、找回、銷燬、更新都需要我們自己保障。因此對於私鑰的整個生命週期,都需要有嚴格的方式方法對其進行管理控制,確保資產的安全性。
一、私鑰的生成
私鑰:一個256位的二進位制隨機數,自身的品質完全取決於產生私鑰的隨機數的品質。若祕鑰產生過程隨機性不足,使其可預測,那麼後續一切對其進行的安全保護措施都是徒勞。
隨機數是以現代密碼學為基礎的資訊安全系統的基石,整個系統的安全性完全依賴於隨機數序列的生成效率和品質。高品質的隨機數的核心是“不可預測性”。對於隨機數來說分為兩種:偽隨機和真隨機。
偽隨機也就是假隨機,一般依靠種子和演算法,知道種子或者已經產生的隨機數,可以獲得接下來的隨機數,具有可預測性。當前主流的區塊鏈系統就是用該方法生成的私鑰.......
真隨機數一般基於硬體的設計,根據外界的溫度、電壓、電磁場、環境噪聲等產生隨機數,隨機的不可預測性大大增加。金融領域的安全密碼晶片均是採用此設計。
我們詳細看下是如何從一個隨機數生成私鑰的?
生成私鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機性來源。生成一個比特幣私鑰在本質上與"在 1 到 2256 之 間選一個數字"無異。只要選取的結果是不可預測或不可重複的,那麼選取數字的具體方法並不重要。比特幣軟體使用作業系統底層的隨機數生成器來產生 256 位 的熵(隨機性)。通常情況下,作業系統隨機數生成器由人工的隨機源進行初始化,也可能需要通過幾秒鐘內不停晃動滑鼠等方式進行初始化。
更準確地說,私鑰可以是 1 和 n-1 之間的任何數字,其中 n 是一個常數(n=1.158*1077,略小於 2256),並由比特幣所使用的橢圓曲線的階所定義。要生成這樣的一個私鑰,我們隨機選擇一個 256 位的數字,並檢查它是否小於 n-1。從程式設計的角度來看,一般是通過在一個密碼學安全的隨機源中取出一長串隨 機位元組,對其使用 SHA256 雜湊演算法進行運算,這樣就可以方便地產生一個 256 位的數字。如果運算結果小於 n-1,我們就有了一個合適的私鑰。否則,我 們就用另一個隨機數再重複一次。
二、私鑰的儲存
每個比特幣地址都對應一個私鑰,掌握私鑰就是掌握了其對應地址中的比特幣。通俗的說就是,一把鑰匙開啟一把鎖,如果比特幣地址是鎖,那麼私鑰就是這把鎖的鑰匙。
私鑰的儲存和使用一般分為軟實現和硬實現。
軟實現即儲存和使用都以軟體形式。金鑰生成後作為檔案或字串儲存在使用者終端或者託管到伺服器,使用時直接或通過簡單的口令控制讀取到私鑰明文到記憶體,通過CPU完成私鑰計算。這種儲存和使用方式顯然有很多安全風險,容易被黑客或內鬼複製、竊取、暴力破解等。
硬實現一般是依託專用密碼安全晶片或者密碼裝置作為載體。一般有物理保護、敏感資料保護、金鑰保護等機制,確保私鑰必須由專用硬體產生。在任何時間、任何情況下,私鑰均不能以明文形式出現在密碼裝置外;密碼裝置內部儲存的金鑰應具備有效的金鑰保護機制,防止解剖、探測和非法讀取。私鑰不可匯出,僅可計算輸出簽名值。
但無論是軟還是硬,只要其他人知道了你的私鑰,就能轉走你的資產。記住,誰手握私鑰,誰才是資產真正的主人。
三、私鑰的使用安全
在私鑰使用時,需要保證使用環境安全,對於私鑰檔案的訪問、讀取、寫入需要有相關許可權控制。在使用完成後,需要將快取在記憶體中的所有敏感資料使用專用函式清除,防止敏感資料洩露。從密碼破譯角度來說,私鑰在使用一定週期後,應該更換金鑰,這就是涉及私鑰銷燬和更新的問題,我們後面有介紹到。
四、私鑰恢復
傳統中心化的銀行如果U盾丟失或者忘記密碼,則可以通過賬戶系統重新繫結一個新的U盾(私鑰)即可。賬戶和私鑰是邏輯上的繫結關係,由中心化的銀行在滿足風控要求下操作。還有一些傳統中心化支付機構,當用戶資產憑證丟失後,可通過中心化機構通過自己的身份憑證找回相關的資料。
但在區塊鏈系統中,沒有中心化機構幫助我們備份私鑰等敏感資料。因此在設計系統的私鑰管理方案時,需要提供多種備份恢復方式,如使用助記詞或使用密碼加本地密文檔案的方式恢復私鑰資料。但是如果你的助記詞也丟失了,就等於啥都丟了。
五、私鑰銷燬
六、私鑰更新
在區塊鏈領域,私鑰是唯一代表使用者身份或數字資產的憑證,如果需要更新私鑰則要重新繫結註冊或者數字資產轉移。所以當你需要更換私鑰時,需要保證新的私鑰被安全生成或匯入,資產也已經安全轉移,舊的私鑰被安全銷燬。
一切始於可見性,私鑰的安全關係著數字資產的安全,個人隱私的安全,所以安全地確保私鑰生命週期的每一步非常重要。