数字货币钱包遇到的难题
钱包是用户访问区块链最重要的入口。但如何实现一个方便用户使用同时又足够安全的钱包一直是区块链世界的难题。软件钱包的问题在于为了保证一定的安全性,必须采用高强度密码加密,这就要求用户必须记忆复杂的密码。很多用户忘记了 keystore 的复杂密码,导致不必要的财产损失。硬件钱包除了成本问题之外,使用麻烦也是很大的弊端,很难想象使用硬件钱包高频调用 dApps。
在生物识别大行其道的今天,人们很希望能够用指纹或 faceID 等简单的安全认证方式使用区块链钱包。然而遗憾的是,通常情况下生物识别在 App 中只是简单的程序跳转,在攻击者面前没有提供任何安全屏障。
上图是标准的软件钱包加生物识别授权的程序流程图。可以看到,密钥的保存和加解密都是在应用层实现的,攻击者很容易截取私钥数据,或者绕开生物识别认证。
硬件安全
密钥的硬件管理可以为数字货币钱包提供极高的安全性。一个硬件密钥设备通常具备如下几个特性:
- 密钥在硬件内部生成,且无法通过任何方式导出
- 硬件设备对外提供公钥导出接口和私钥签名接口
常见的硬件钱包如 Trezor、Nano Ledger 等都符合上述要求。
事实上,iOS 和 Android 也都支持基于硬件的加密保护。其中 iOS 提供基于 Secure Enclave 的安全芯片加密服务,Android 从 7.0 之后提供基于 Secure Element 的安全加密 API。通常情况下,智能手机的生物识别模块与安全芯片模块是紧耦合的,意味着授权、签名过程由安全芯片托管,签名授权不会被攻击者截取或伪造。
这种模式的用户体验会非常好,用户只需要按压指纹或者进行人脸识别,即可签名交易。此外,这种模式的安全性与硬件钱包一致。私钥一直保存在硬件设备中,攻击者无法通过任何手段获取用户私钥。且授权过程与签名过程同步,授权安全性由硬件保证,攻击者也无法进行截取或插入攻击。
现实并不完美
这么好的模式为什么数字货币钱包没有采用呢?因为不论是 iOS 还是 Android,其硬件安全的签名算法只支持有限的几种,并不支持 BTC、以太坊采用的 Secp256k1 算法。前段时间 Apple 宣布推出 CryptoKit 密码学 API 扩展,就有区块链开发者吐槽难以用在数字货币钱包里面。
确实有区块链采用了硬件友好的签名算法,例如 Tezos,它为用户提供了三种可选的交易签名算法, Secp256k1、Ed25519以及Secp256r1(后两者被 iOS 和 Android 的硬件加密模块支持)。所以 Tezos 的移动钱包可以利用到最新的智能手机安全特性,方便快捷地进行交易签名。
但还有问题。
由于安全性限制,智能手机内的硬件钱包无法备份,就意味着一旦手机丢失,你的数字资产再也无法找回。
Good News from Nervos CKB
和几乎所有的公链项目不同,Nervos CKB 将密码学算法作为抽象的原语与底层剥离。用户可以指定自己的资产或合约采用任意预定义的密码学算法验证授权。这就意味着用户交易的签名算法可以采用智能设备支持的 Secp256r1 算法或者 Ed25519 算法。那么如何解决私钥无法备份的问题呢?我们可以将交易授权算法设置成 1-of-2 多签算法,其中一个签名由硬件设备生成,另一个签名由标准的助记词方式生成。二者之一就可以成功地发起交易。首次初始化的时候用户生成助记词和硬件私钥,并将助记词备份后从设备删除。这样一旦设备丢失,用户可以使用助记词恢复对资产的控制权。
通过这样的设计,用户在正常情况下可以非常安全便捷地使用生物识别技术操作自己的钱包。在特殊情况下也可以使用助记词恢复。考虑到进一步的安全性,CKB 也支持对两个密钥不同的操作权限管理。例如设置助记词密钥只能每天转账总资产的 5% 等。
CKB 抽象了签名算法层,意味着用户可以将大量授权的逻辑和密码学原语在应用层描述,极大地增加了钱包设计的灵活性。相信未来会有更多钱包应用创新出现在 CKB 上。