硬件钱包技术白皮书(2014-5-9 更新)

1 背景

比特币是一种网络信息资产。不需要过多解释,大众都非常清楚,网络信息资产的安全风险要远大于实物资产。

信息安全风险主要分为两大方面:信息泄露安全风险、信息完整性破坏安全风险。

1.1 信息泄露风险

网络资产的所有权和控制权,只能通过账户和密码。

比特币更加极端,私钥就是一切。因为账户地址可以由私钥导出。这与之前的所有网络资产都有巨大的区别,其他网络资产的账户名和密码在数学上没有必然关联,只是在数据库里有对应关系,这也是导致大量小白弄丢比特币的重要原因。

比特币的支付,即控制权,由私钥签名完成。

当前的所有比特币钱包,由于私钥的生成、解密、签名、交易信息广播全部由同一软件在联网状态下完成,所以坏人(通常理解为黑客)可以通过网络盗走持币人的私钥,导致账户内全部的比特币丢失。

简而言之,如果私钥是通过?#36828;?#25191;行的程序与互联网连接的,就是不安全。

(此处应配一个图,回头画)

1.2 信息完整性破坏风险

如前述,私钥是比特币的唯一控制权。私钥的丢失会导致账户内比特币的不可逆丢失。

由于比特币的私钥(无论?#29992;?#19981;?#29992;埽?#37117;是存储在电脑(含?#21482;?#37324;的一个文件里,而电脑里会同时安装执行大量的其它程序,所以备份的不善加上电脑系统的故障,可能导致比特币丢失,这种丢失在早期发生率非常高,有人一下子就丢了上万个币。

所以,比特币账户安全理论上和现实上都是巨大的风险,需要技术上提供?#34892;?#30340;解决方案。这也是本产品的研发初衷。

2?提高比特币账户安全的原理

基于以上分析,可以得出结论,提高比特币账户安全,必须做到以下3点,?#24065;?#19981;可:

2.1 独立硬件载体。

只有硬件独立了,私钥才不容易被黑客盗走;只有硬件独立了,才更稳定,不容易因为电脑故障丢失私钥。

2.2 不联网.

只有不联网,黑客才没有办法侵入系统窃取私钥。

2.3 不与联网的设备?#36828;?#36890;讯

网络只是无数通讯方式的一种,现在通讯方式多了,例如NFC,蓝牙,USB,COM。只要能够?#36828;?#36890;讯,私钥信息就可能被后门程序通过通讯协议?#36828;?#21457;送?#20132;?#32852;网上。特别是很多通讯方式都是无线的。

以上3点合为一句话,有点绕嘴:将私钥在物理上独立地存放在一个不通过?#36828;?#36890;讯方式与联网设备通讯的载体上。

这个私钥载体,被形象地称为“硬件钱包”。

因而现在很多人的解决方案都是买一台电脑,专门用来安装比特币钱包,不做任何其他用途。本质上,这就是一个硬件钱包。所以?#36828;?#26131;见,一个专用的硬件钱包,相比一台电脑,无论从成本、易用性、安全性上,都要好很多。

纸钱包、脑钱包都是广义上的硬件钱包,是低成本解决方案,?#27604;?#20063;各有优缺点。很显然,如果不差钱,还是专用的硬件钱包安全。

?3 硬件钱包的系统构成

虽然称为“硬件钱包?#20445;?#20294;是这实际上是一套包括多个硬件、软件、通讯协议的解决方案,主要包括以下5个部分:

3.1 离线硬件(“硬件钱包”实物)。存储和执行硬件钱包离线端软件,存储私钥。提供与用户互动的界面,提供与联网硬件进行数据传递的硬件装置。

3.2联网硬件。可以是任何电脑、?#21482;?#26381;务器。存储和执行硬件钱包联网端软件。具备与离线硬件进行数据传递的硬件装置。

3.3 离线端软件。?#37038;?#20184;款指令,对交易进行签名,向联网端软件发送签名后的交易。

3.4 联网端软件。向离线端软件发送付款指令,从离线端软件?#37038;?#31614;名后的交易,并广播到比特币网络。

3.5 通讯协议。离线端软件和联网端软件的数据交换协议。这个协议是独立于离线端软件和联网端软件的。即未来任何人都可以基于这个协议开发联网端软件和离线端软件,而这些软件都可以相互兼容。

基于这样一个系?#24120;?#20351;得私钥和联网端软件彻底的分离,大幅提高了比特账户安全性。但是其价值不仅仅是这些,更有价值的是,由于签名过程中用户的人工介入,离线端软件和联网端软件之间公开的通讯协议,?#32422;?#31163;线端软件和联网端软件的控制权的分离带来的多?#31283;?#35748;,实现了对离线端软件、联网端软件的信任需求为0。换言之,即便离线端软件和联网端软件任何一方甚或双方为恶意软件,都不会导致用户比特币的丢失。

因而,这些软件就不必通过开源来取得用户的信任,因为开源其实是产生恶意软件的重要原因(在?#21019;?#30721;基础上挂上个木马,就成为了恶意软件;而如果不开源,则需要破解程序再挂木马,二者的?#35759;?#23436;全不是一个数量级)。

另外一个价值是,离线系统和联网系统的所有权可以完全分离。例如用户去商家消费,用户只需持有离线系?#24120;?#30828;件钱包),通过与商?#19994;?#32852;网系统互动来完成支付。通过这种分离,使得硬件钱包的实际使用复杂程度并不比原始的一体式钱包系统高,甚至会有所降低(比如用户完全不需下载安装任何软件;比如相比?#21482;?#38065;包大幅节省了网络流量和网费;比如在没有移动网络信号i的地方,依然可以进行支付,因为商家连接了有线网络)

4 通讯方式的选择

? ? 基于第2条的论述,硬件钱包的通讯方式,不能是?#36828;?#36890;讯?#22351;?#21516;时,比特币是数字货币,通讯方?#25509;?#24517;须是数?#21482;?#30340;。同时符合这2条的通讯方式,选择余地就非常少了。不赘述筛选过程了,结论是,最佳通讯方式是二维码。二维码具有以下特点:

4.1 非?#36828;?#36890;讯,必须有人工干预

? ?二维码必须有一个扫描的过程。这个扫描过程必须是人工干预的,扫描摄像头与被扫描屏幕需要一个人工对准的过程。有了这样一个过程,就彻底无法实现?#36828;?#36890;讯,也就彻底切断了程序的一切潜在后门。

4.2 数?#21482;?#36890;讯,传输差错率极低

? ?二维码是数?#21482;?#30340;,不必赘述。二维码的设计里已经包括了容错机制,所以传输差错率极低。

4.3 通用协议,兼容性极强

? ?二维码是一个被广泛?#37038;?#30340;通讯协议。只要有摄像头,再配合一个二维码扫描程序,就可以获取二维码信息。特别是现在智能?#21482;?#24179;板电脑、?#22987;?#26412;电脑都自带摄像头,新增硬件成本为0,这对于应用的普及帮助非常大。

4.4 可视化,保证安全

? ? 虽然二维码不能直接被人阅读,但是二维码的图形与其解析后的信息是完全对应的。使用任何通用二维码扫描程序都可以解析出其中的信息,等于有了“第三方公证”。所以,用户在广播交易之前,可以完全了解这个交易的支付对象和支付金额。基于这一特性,只采用二维码的硬件钱包是彻底地不能再彻底的安全的。

5 简要工作流程

硬件钱包的简要工作流程如下(以后有时间再做漂亮的图表):

5.1 硬件钱包创建账户(输入密码,生成公钥私钥对,用密码给私钥?#29992;堋?#21482;保存?#29992;?#21518;的私钥)

5.2 硬件钱包申请收款(显示账户的地址,文字?#32422;?#20108;维码)

5.3 付款方获取地址(抄写文?#21482;?#25195;描二维码)

5.4 付款方付款

5.5 硬件钱包申请刷新余额(二维码显示收款地址)

5.6 联网端软件获取刷新余额申请(扫描二维码)

5.7 联网端软件从比特币网络获取该地址的交易记录

5.8 联网端软件显示交易记录(二维码)

5.9 硬件钱包获取交易记录(扫描二维码)

5.10 硬件钱包获取付款地址和付款金额(扫描二维码或手工输入)

5.11 硬件钱包生成未签名的付款交易

5.12 用户输入密码,硬件钱包为交易签名

5.13 硬件钱包显示付款交易(二维码)

5.14 联网端软件扫描付款交易

5.15 联网端软件验证付款交易(此处可以有用户人工确认)

5.16 联网端软件向比特币网络广播该交易

?

就安全问题再作一些?#24471;鰨?/p>

比特币账户的收款,收款方无需做任何事情,付款方广播交易后,比特币网络会?#36828;?#35760;录。因而在收款?#26041;冢?#19981;存在任何安全风险。所有的安全风险都来自付款?#26041;凇?/p>

交?#36164;前?#29031;标准通讯协议非?#29992;?#26174;示为二维码的,任何多余的信息或者不正确的信息会被立即发现。所以,不存在私钥泄露的风险。

用户可以使用值得信赖的设备(如有必要,采用非联网设备)和软件(第三方验证软件,或开源验证软件)解析?#31169;?#26131;信息,判断是否有恶意行为(验证二维码中是否包含私钥信息,验证收款地址是不是用户输入的地址)。

因而,本硬件钱包方案从理论上彻底规避了比特币的安全风险。即便开发者在硬件钱包中嵌入了恶意代码,也无法得?#36873;?/p>

所以,用户对于硬件钱包供应商可以是0信任,这秉承了比特币的0信任理念。

6 通讯协议

硬件钱包的安全风险只来自硬件钱包向外输出信息时(可能泄露私钥),所以在此公布硬件钱包所有的向外通讯协议。这些协议都是明文的,可以用任何二维码扫描软件读取。

操作 发送方 项目 长度 内容
备份 离线 指令 1 ? 0xbc
? ? 币种 1 ?
? ? 信息长度 2 ?
? ? 钱包文件 153 ?bitcoinj格式标准钱包文件
? ? 校验码 4 ? HASH

?

申请同步 离线 指令 1 ? 0xff
? ? 币种 1 ?
? ? 地址长度 1 ?
? ? 地址 34/35 ? ?#22336;?#20018;格式的地址
? ? 最后同步时间 8 ?
? ? 最后同步交易ID 32 ?

?

发送交易 离线 指令 1 ? ? 0x88
? ? 页数 1 ?
? ? 第几页 1 ?
? ? 币种 1 ?
? ? 信息长度 2 ?
? ? 交易信息 长度 ?

交易信息的格式是比特币协议的标准格式:

? ? ? ? bytes ? ?
header ? ? ? ? ? ?
? packetmagic ? 4 ? 包头
? command ? ? 12 ? 信息包类型(transaction)
? message.length ? 4 ? 包长度
? hash ? ? 4 ? 包的doubledigest HASH
trx ? ? ? ? ? ?
? version ? ? 4 ? ?
? inputs.size ? 1~5 ? ?
? inputs ? ? ? ? ?
? ? outpoint ? ? ? ?
? ? ? hash 32 ? 上一个交易的HASH
? ? ? index 4 ? 第几个输出
? ? scryptbytes.length 1~5 ? ?
? ? scryptbytes 106~107 ? 签名+公钥
? ? sequence ? 4 ? 0
? outputs.size ? 1~5 ? ?
? outputs ? ? ? ? ?
? ? value ? 8 ? 支出额
? ? scryptbytes.length 1~5 ? ?
? ? scryptbytes 25 ? 公钥
? locktime ? ? 4 ? 0