區塊鏈節點密鑰管理
- 2020 年 3 月 18 日
- 筆記
導語 目前絕大多數區塊鏈節點的私鑰都是以明文方式存儲在配置文件中,一旦機器被攻擊,就很可能造成私鑰泄露,進而導致更嚴重的損失,包括數字資產或隱私數據被竊取。有些節點使用密文的方式存儲私鑰,但加密所用的密鑰缺乏較好的保護措施,容易被盜取,導致私鑰的泄露。
1、概述
本文主要討論一種區塊鏈節點的密鑰管理方案。區塊鏈節點都會有各自的私鑰,將一段隨機數分成兩段,一段存在配置文件,一段寫在節點的運行程式碼里,通過某種演算法結合這兩段隨機數,生成一個對稱密鑰,用這個對稱秘鑰對私鑰加密,將加密後的私鑰存儲在配置文件中。節點需要對交易簽名時,再次通過這兩段隨機數生成對稱秘鑰,獲取配置文件中已加密的私鑰,通過生成的對稱秘鑰解密後,用解密獲得的私鑰對交易進行簽名。
2.現有技術方案
現有技術對區塊鏈節點私鑰或密鑰的管理辦法在安全性方面有較大缺陷,本文提出的對密鑰的管理方法,可以很大程度地提高私鑰的安全性,(1)私鑰通過對稱密鑰加密保存,杜絕明文存儲帶來的泄露風險;(2)隨機數分兩段存儲,通過特定演算法生成對稱密鑰,提高對稱密鑰的安全性,即使機器的半段隨機數泄露,攻擊者也無法獲得對稱密鑰;(3)每次需要簽名時才生成對稱密鑰解密,不保存對稱密鑰,也不保存解密後的私鑰,防止對稱密鑰或私鑰泄露。
3、具體技術方案
用戶通過客戶端或SDK發起交易,節點對交易簽名後同步到區塊鏈網路中。簽名可達到身份驗證的目的。具體簽名過程如下:

圖1 簽名過程圖
資訊通過hash函數得到一段hash摘要,再用私鑰對摘要加密,生成簽名,並將簽名跟資訊一起同步到其他節點,其他節點收到資訊後,用對應節點的公鑰解密簽名,得到Digest,與hash(Message)的值對比,如果相同,即可驗證該資訊是對應節點發出的。
本文主要是對簽名的過程做了一些安全性的措施,包括(1)私鑰加密存儲;(2)加密密鑰在運行時通過隨機數獲取;(3)隨機數分兩段存儲。
基於私鑰的重要性,需要考慮以下幾點,(1)私鑰不可明文保存;(2)加密私鑰的密鑰不可明文保存;(3)生成密鑰的方法。針對這幾點的考慮,區塊鏈節點的密鑰管理方案整體結構流程圖如下:

圖2 結構流程圖
區塊鏈節點中都存有一對公私鑰,公鑰可用來加密資訊,通過私鑰解密,同時,私鑰也可以為交易簽名,達到身份驗證的效果。詳細步驟說明如下:
(0)用步驟3生成的對稱密鑰加密私鑰,並保存在配置文件中,同時,用來生成對稱密鑰的隨機數分成兩段,一部分存儲在配置文件中,一部分在運行程式碼里;
(1)用戶通過客戶端或SDK發起交易;
(2)節點獲取配置文件里的隨機數和加密私鑰;
(3)結合兩段隨機數,通過特定演算法,生成對稱密鑰。這裡演算法有很多種,例如RSA演算法,DSA演算法等,對生成演算法做一些訂製化改造,或使用自己開發的生成演算法,保證生成演算法的唯一性;
(4)用步驟3生成的對稱密鑰解密加密後的私鑰;
(5)用私鑰對交易簽名;
(6)銷毀記憶體中的私鑰、對稱密鑰。
整個過程私鑰或密鑰都沒有保存在機器的文件中,防止泄露。隨機數分兩段保存,即使攻擊者拿到了機器上配置文件的隨機數和加密私鑰,也無法生成密鑰。
相比於現有的技術方法,在以下幾個方面做了改進,首先在私鑰存儲上,密文存儲,攻擊者無法用加密後的私鑰做出什麼攻擊性操作,其次是密鑰生成方法,將隨機數分成兩段,使用特定不公開的演算法生成,提高密鑰的竊取難度,保證它的安全性,最後是每次需要簽名時才生成密鑰解密私鑰,很大程度降低密鑰或私鑰的泄露風險。
隨機數數列分為真隨機數數列和偽隨機數數列。真隨機數數列是完全不可預測的,可以通過放射性衰變、電子設備的熱噪音、宇宙射線的觸發時間等物理過程得到,但無法通過單純的軟體方式獲得;偽隨機數數列是可預測的,嚴格意義上不具有隨機性質,通常用數學公式的方法獲得。大部分程式和語言中的隨機數,確實都只是偽隨機。但本文將隨機數分成兩段,大大降低了隨機數被竊取的風險。

