| 导语 目前绝大多数区块链节点的私钥都是以明文方式存储在配置文件中,一旦机器被攻击,就很可能造成私钥泄露,进而导致更严重的损失,包括数字资产或隐私数据被窃取。有些节点使用密文的方式存储私钥,但加密所用的密钥缺乏较好的保护措施,容易被盗取,导致私钥的泄露。
本文主要讨论一种区块链节点的密钥管理方案。区块链节点都会有各自的私钥,将一段随机数分成两段,一段存在配置文件,一段写在节点的运行代码里,通过某种算法结合这两段随机数,生成一个对称密钥,用这个对称秘钥对私钥加密,将加密后的私钥存储在配置文件中。节点需要对交易签名时,再次通过这两段随机数生成对称秘钥,获取配置文件中已加密的私钥,通过生成的对称秘钥解密后,用解密获得的私钥对交易进行签名。
现有技术对区块链节点私钥或密钥的管理办法在安全性方面有较大缺陷,本文提出的对密钥的管理方法,可以很大程度地提高私钥的安全性,(1)私钥通过对称密钥加密保存,杜绝明文存储带来的泄露风险;(2)随机数分两段存储,通过特定算法生成对称密钥,提高对称密钥的安全性,即使机器的半段随机数泄露,攻击者也无法获得对称密钥;(3)每次需要签名时才生成对称密钥解密,不保存对称密钥,也不保存解密后的私钥,防止对称密钥或私钥泄露。
用户通过客户端或SDK发起交易,节点对交易签名后同步到区块链网络中。签名可达到身份验证的目的。具体签名过程如下:
信息通过hash函数得到一段hash摘要,再用私钥对摘要加密,生成签名,并将签名跟信息一起同步到其他节点,其他节点收到信息后,用对应节点的公钥解密签名,得到Digest,与hash(Message)的值对比,如果相同,即可验证该信息是对应节点发出的。
本文主要是对签名的过程做了一些安全性的措施,包括(1)私钥加密存储;(2)加密密钥在运行时通过随机数获取;(3)随机数分两段存储。
基于私钥的重要性,需要考虑以下几点,(1)私钥不可明文保存;(2)加密私钥的密钥不可明文保存;(3)生成密钥的方法。针对这几点的考虑,区块链节点的密钥管理方案整体结构流程图如下:
区块链节点中都存有一对公私钥,公钥可用来加密信息,通过私钥解密,同时,私钥也可以为交易签名,达到身份验证的效果。详细步骤说明如下:
(0)用步骤3生成的对称密钥加密私钥,并保存在配置文件中,同时,用来生成对称密钥的随机数分成两段,一部分存储在配置文件中,一部分在运行代码里;
(1)用户通过客户端或SDK发起交易;
(2)节点获取配置文件里的随机数和加密私钥;
(3)结合两段随机数,通过特定算法,生成对称密钥。这里算法有很多种,例如RSA算法,DSA算法等,对生成算法做一些定制化改造,或使用自己开发的生成算法,保证生成算法的唯一性;
(4)用步骤3生成的对称密钥解密加密后的私钥;
(5)用私钥对交易签名;
(6)销毁内存中的私钥、对称密钥。
整个过程私钥或密钥都没有保存在机器的文件中,防止泄露。随机数分两段保存,即使攻击者拿到了机器上配置文件的随机数和加密私钥,也无法生成密钥。
相比于现有的技术方法,在以下几个方面做了改进,首先在私钥存储上,密文存储,攻击者无法用加密后的私钥做出什么攻击性操作,其次是密钥生成方法,将随机数分成两段,使用特定不公开的算法生成,提高密钥的窃取难度,保证它的安全性,最后是每次需要签名时才生成密钥解密私钥,很大程度降低密钥或私钥的泄露风险。
随机数数列分为真随机数数列和伪随机数数列。真随机数数列是完全不可预测的,可以通过放射性衰变、电子设备的热噪音、宇宙射线的触发时间等物理过程得到,但无法通过单纯的软件方式获得;伪随机数数列是可预测的,严格意义上不具有随机性质,通常用数学公式的方法获得。大部分程序和语言中的随机数,确实都只是伪随机。但本文将随机数分成两段,大大降低了随机数被窃取的风险。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。