作者:Blocstream
来源:https://blog.blockstream.com/jade-virtual-secure-element/
遍数硬件签名器的评测,你会在关于 Jade 的描述中看到同样的一行:没有安全芯片。这行文字通常是作为一个判决,而不是一个疑问 —— 这令人遗憾,因为它本身是个很好的问题。作为一个电子设备,不管是什么设备都好,怎么防止别人不断重试一个 6 位数字组成的 PIN 码呢?
Jade 的答案是设计一个 “虚拟” 的安全芯片,将解密你的钱包的能力拆分成两个单独的部分。没有任何一部分可以单独完成解密。以下是它的工作原理的介绍,以及攻击者的尝试会得到什么结果。
安全芯片与你的 PIN 码
一个专用的安全芯片会做三件事:
- 将密钥材料存储在一块能够抵抗物理侦测的硅片中
- 限制可以试错 PIN 的次数;达到次数就清空你的设备
- 在内部检查 PIN 码对错;所以 PIN 码自身是永远不暴露给设备的其余部分的
这些就是我们的目标。安全芯片是一种实现这些目标的办法。而 Jade 通过将完整的任务在你的设备和一个对你一无所知的服务器之间拆分,实现了同样的三个目标。
两个密钥,一个柜子
想象一个老式的保险柜,你需要凑齐两把钥匙才能打开它:你自己有一把,银行那里放着另一把。单靠一把是无法打开这个柜子的。
你的助记词,是加密之后存放在 Jade 设备中的。而解密的密钥,没有完整地存放在任何地方,Jade 设备里面没有,Jade 之外也没有。你每次解锁,都要重新派生出这个密钥;而派生它的材料有两个,分别存放在不同的地方。其一是你用 Jade 的按钮输入的 PIN 码; 其二则是由一个盲化的断言机持有的秘密值 —— 这是一个持有一半信息(half the arrangement),但看不到另一半的服务端。Blockstream 就运行了这样的一个服务端。但你可以在自己的笔记本电脑或者树莓派上运行一个,因为它的软件代码是完全开源的。
这个断言机永远不会拿到你的 PIN 码。Jade 发送的只是一个它的一个可以随意发送到任何地方的派生值,是它跟每个设备唯一的密钥混淆之后,在设备内生成的。固件没有地方会暴露这个设备密钥,而没有它,派生就毫无意义。Blockstream 运行了断言机,但依然无法倒推出你的 PIN 码。
在你解锁 Jade 的时候,发生了什么
- 你在自己的 Jade 上输入 PIN 码(绝不在电脑上输入,也绝不在某个 app 上输入)。
- Jade 将 PIN 码的乱码派生值发送给断言机;消息是由你的配套 app 转发的,但这个 app 只是一个信使,看不到里面的内容。
- 断言机根据它为设备保存的记录来检查派生值。如果匹配,则断言机会返回自己持有的那一半信息;而 Jade 会将它与你输入的 PIN 码相结合,构造出解密密钥。
- 如果不匹配,双方都会记录一次失败。输错三次 PIN 码之后,双方都会毁掉自己的副本。Jade 会清空加密后的钱包数据,断言机也会覆写掉它手上的那一半信息,然后删掉记录。
Jade 也支持所谓的 “擦除 PIN 码”。一旦输入的是擦除 PIN 码,设备就会擦除密钥信息并关机。设备上不会有任何信息表明存在过另一个 PIN 码。
攻击者能得到什么
安全设计的价值体现在攻击者无法得到什么。以下是五种情形。
某个窃贼盗取你的 Jade 并抽取出了 Flash 存储芯片中的内容。 假设他完全得手,那么会得到一个加密的数据块,以及设备的唯一密钥。但存储芯片中没有断言机的那一半信息,而没有这一半信息就无法试验一个 PIN 码对不对。所以,攻击者没办法按一下按键就开始穷举试错,因为只要断言机不参与,就无法试出来。
所以,盗贼现在瞄准断言机。断言机会应答 3 次。计数器安放在服务器上,所以,拿到设备并不会让攻击者可以重置它、诱发它的故障或等待它自行释放。三次错误之后,断言机就会删掉自己手上的碎片,而这些加密的数据就永远无法解密了。所以,攻击者只有三次猜测 6 位数字 PIN 码的机会,没猜对,就永别了。
配套的 app 或者运行 app 的电脑是恶意的。它转发的是加密流量,它既不能读取其中的内容,也无法伪造,也永远接触不到你的 PIN 码,因为你都是在 Jade 上输入的。它可以拒绝传递消息,这样你就无法解锁,但它也拿不到你的密钥。
断言机叛变了,或者 Blockstream 堕落了。攻击者可以得到一堆密钥碎片和一个 PIN 码快速派生值的表格,但两者都没什么用。这些派生值不会揭晓各个设备的唯一密钥,也不会揭晓它们的 PIN 码,而光靠这些密钥碎片也无法打开任何钱包。断言机可以拒绝你访问,但永远花不了你的比特币;而你的助记词可以直接复原钱包,无需断言机的帮助。
有人窃听网络。每一次尝试都会运行在一个新的加密会话中,带有递增的抗重播计数器,所以捕捉的流量是无法重播的,旧的响应也无法重复使用。
每一条攻击路径都会在同一个点停下,因为再往前走就需要两个秘密值,而这两个秘密值不会由同一个参与者持有。
为什么 Blockstream 要选择这种方式
安全芯片供货商的供货协议都是带有保密条款的。围绕这样的元件来开发钱包,这个元件就会变成既是安全上最关键的部分,又是只有供货商才知道其中细节的东西。这个取舍,是 Jade 不能接受的,它希望让钱包层面的协议、固件、语义和断言机实现都是可以公开检查、可以在通用硬件上使用的。
“虚拟安全芯片(Virtual Secure Element)”是一套协议,而不仅仅是 Jade 的一个特性,所以,它可以用在使用现成元件组装而成的 DIY 签名器中。使用安全芯片,其保密条款和成本会让这扇门彻底关闭。
牺牲
在两方之间分割一个密钥,可以获得真实的收益,也会牺牲一些东西。
使用 PIN 码解锁将需要能够访问断言机。当断言机离线时,Jade 也还能工作,但只能是无状态模式:通过 SeedQR 扫描直接读取你的种子词,或者你手动输入,完全不需要断言机。你的种子词就是你的钱包,Jade 不是,你可以在任何地方复原这个钱包,就像任何签名器一样(不管它是否带有安全芯片)。
微控制器并不是加固的硅片,Jade 也从未这么声明过。安全芯片还能抵抗实验室级别的攻击,比如故障注入和针对通电设备的功率分析。虚拟安全芯片可以保护你的加密的钱包数据以及传输中的 PIN 码,但无法将一个通用芯片转化成抗篡改的芯片。
两方协议也比单芯片设计有更多的故障模式。区分 “网络断线” 和 “错误 PIN 码” 必须非常准确,否则可能就会浪费一次尝试机会(计数器会递增一次)。这是固件秉持的一项原则,是公开的,每个人都可以检查它的动作。
自己检查
能够验证的论证才有意义,因此我们公开了一切。包括 Jade 固件 和盲化断言机服务端的软件实现,都是开源的。处理 PIN 码的部分,在设备固件中是 main/process/pinclient.c 文件、在服务端软件实现是 pindb.py 。
给技术爱好者的说明:Jade 会用 PIN 码和设备唯一密钥的嵌套 HMAC(基于哈希的消息认证码)作为 pin_secret 。服务端只存储 SHA-256(pin_secret) 以及一个加密的按账户密钥碎片以及一个尝试计数器。在匹配的情形中,服务端会返回对应的密钥碎片,然后设备就可以用 HMAC(key_share, pin_secret) 派生出最终的 AES (解密)密钥。设备发送的请求运行在临时的 “椭圆曲线 DH 密钥交换(ECDH)” 会话中,使用的服务端密钥是用一个递增的抗重播计数器调整过的。设备上的钱包数据是 AES-256-CBC 加密的,使用一个新的随机初始化向量(IV),并通过一个附带的针对 IV 和密文的 HMAC-SHA256 来认证完整性,Jade 在解密之前会验证它们。
- 了解 Jade Plus
- 阅读 Jade 安全模式 FAQ,了解常见问题的回答
- 运行你自己的盲化断言机
(完)