数字签名作为去中心化的身份鉴别方案在区块链世界里大获成功,广为使用的基于椭圆曲线的数字签名方案,尤以基于Secp256k1、Ed25519等曲线为基础算术运算的签名算法最为常见。但是无论是哪种方案的使用,正确的私钥才是操作地址或账户的唯一方法。这也是“私钥即资产”这一概念被区块链用户信奉的原因之一。
私钥是密码学或者说是数学概念,在不同的空间的展现形式各不相同,例如人类可读的世界里,常被编码成“助记词”的形式,并且这种做法已经被区块链社区所标准化,形成了诸如BIP39的标准助记词列表。在数字世界中,私钥的存储形式也可以将助记词自己数字化存储。但是由于在数字世界中,容易被木马或者黑客窥探到,所以不能明码的存储助记词(因为编码规则公开,这样等同于明文存储私钥),通常采用keystore的方式来存储私钥。
DEAX原生钱包Keystore存储方案
Keystore是一种介于去中心化身份鉴别方案与中心化身份鉴别方案之间的一种方案。由于不是中心化的,所有可以防止服务器滥用用户权力的问题,但是同时它只能是离线的,所以可能会遭受到离线暴力攻击。
通常来说,一个功能完整的Keystore存储方案必须要包含如下几个模块或算法:
• 随机数发生器模块;
• 基于口令(或者基于其他身份信息的)的密钥生成算法;
• 认证加密方案;
1. 随机数生成算法
Keystore是私钥存储的一种解决方案,需要一种产生私钥的方法。通常为了私钥之间不产生冲突以及不被暴力破解,私钥的产生都采取随机产生方式,这也是封闭系统产生密钥(私钥、对称密钥)的主要方式。
软件系统不能产生真的随机数,需要依赖于更底层的操作系统或者API中的随机数发生器。DAEX钱包Keystore系统基于Go语言的随机数发生器接口,关于该接口的相关信息,可参考此处。
2. 基于口令的密钥生成算法
Keystore文件通常运用对称加密方案来存储私钥(或者私钥列表),对称加密方案需要对称密钥(即使某些Keystore方案运用非对称加密方案,但是也需要公钥加密以及私钥来解密),此对称密钥需要用户容易记忆(如若不然,回到了原来的私钥保存和记忆的问题)。最常见的易于记忆的方式即用户口令。但是用户口令空间相对来说小很多,并不是一种产生直接的对称密钥的方式。通常的解决方法是利用基于口令的密钥生成算法,来产生对称密钥。
DAEX钱包的基于口令的对称密钥生成算法采用了RFC 5869标准中的HKDF算法(HMAC-based Extract-and-Expand Key Derivation Function)。此标准广泛的应用于例如IKEv2,PANA,EAP-AKA等协议中,是一种基于HMAC的密钥生成算法。该算法需要产生64byte(512bit)的随机数作为盐值(salt)共同参与对称密钥导出运算。盐值记录到最终的Keystore文件中,一边恢复该对称密钥时使用。
如果用其他的身份信息来代替口令,如指纹、面部等身份信息等,可以得到基于其他身份信息的密钥生成算法。前提是需要有此类专业的设备。例如具有采集指纹信息的硬件钱包,可以采用基于指纹的方案。
3. 认证加密方案
如上所说,Keystore文件将加密存储用户的私钥,但是仅仅加密存储私钥并不够。例如用户输入错误的口令,可能会恢复出一个私钥,但是这个私钥已经不是真正的拥有资产的那个私钥了,钱包并不知道恢复的私钥是否正确。这是因为错误的口令在恢复私钥的过程中,由于解密算法并没有识别出口令的正确性而导致的(这是因为仅有的加密功能是不具备识别功能的)。
因此,Keystore需要鉴别功能,用于甄别输入口令的正确性。将鉴别与加密一同合成一个模块,用认证加密方案来解决。
DAEX钱包运用AES-256-GCM方案来实现密钥的认证加密存储。AES-256-GCM使用AES作为基础的加密模块,密钥长度与分组长度均为256bit,对于不足或者超出256bit的明文,采用标准的填充方式,填充值256bit的整数倍。用AES-256算法对一系列的递增的计数器(或称为nonce)的值进行运算,并将运算结果与明文分组进行异或运算得到一系列的加密输出结果。AES-256-GCM的鉴别部分采用基于伽罗华域乘法(一种特殊的乘法)。将以上得出的一系列加密输出的,依次进行伽罗华域乘法,最终得到用于鉴别的数据。
写在最后
正如前面所述,现在绝大多数区块链项目的原生钱包都使用Keystore文件来加密存储用户的私钥数据,用户“口令+Keystore“才能真正拿到私钥。深层次剖析是,Keystore文件并且仅有Keystore文件存储了用户私钥数据,而且是加密存储,用户口令只是打开Keystore的“钥匙”。理论上用户口令与真正私钥是没有任何关系的。但是遗憾的是,笔者在做开发前的调研时发现,在部分项目中,存在用用户口令直接产生最终私钥的方法,或是存在于项目源代码中,或是存在于项目的SDK中、或是存在于部分应用中。运用这个漏洞,笔者真的搜索到了一些地址,成功爆破其私钥。这是项目体系中一个极大的漏洞。因为口令相对于私钥的空间小很多,很容易通过暴力破解口令来破解。
DAEX在项目本身源码层面,不提供通过口令产生私钥的接口,杜绝使用口令直接产生私钥,并且不足够的熵将无法产生私钥。同时DAEX将提示第三方开发者,坚决不能采用口令直接产生私钥的方法。从而保护终端用户资产的安全。