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

1 背景

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

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

1.1 信息泄露风险

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

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

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

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

简而言之,如果私钥是通过自动执行的程序与互联网连接的,就是不安全。

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

1.2 信息完整性破坏风险

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

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

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

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

基于以上分析,可以得出结论,提高比特币账户安全,必须做到以下3点,缺一不可:

2.1 独立硬件载体。

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

2.2 不联网.

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

2.3 不与联网的设备自动通讯

网络只是无数通讯方式的一种,现在通讯方式多了,例如NFC,蓝牙,USB,COM。只要能够自动通讯,私钥信息就可能被后门程序通过通讯协议自动发送到互联网上。特别是很多通讯方式都是无线的。

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

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

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

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

 3 硬件钱包的系统构成

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

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

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

3.3 离线端软件。接收付款指令,对交易进行签名,向联网端软件发送签名后的交易。

3.4 联网端软件。向离线端软件发送付款指令,从离线端软件接收签名后的交易,并广播到比特币网络。

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

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

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

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

4 通讯方式的选择

    基于第2条的论述,硬件钱包的通讯方式,不能是自动通讯;但同时,比特币是数字货币,通讯方式又必须是数字化的。同时符合这2条的通讯方式,选择余地就非常少了。不赘述筛选过程了,结论是,最佳通讯方式是二维码。二维码具有以下特点:

4.1 非自动通讯,必须有人工干预

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

4.2 数字化通讯,传输差错率极低

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

4.3 通用协议,兼容性极强

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

4.4 可视化,保证安全

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

5 简要工作流程

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

5.1 硬件钱包创建账户(输入密码,生成公钥私钥对,用密码给私钥加密。只保存加密后的私钥)

5.2 硬件钱包申请收款(显示账户的地址,文字以及二维码)

5.3 付款方获取地址(抄写文字或扫描二维码)

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 联网端软件向比特币网络广播该交易

 

就安全问题再作一些说明:

比特币账户的收款,收款方无需做任何事情,付款方广播交易后,比特币网络会自动记录。因而在收款环节,不存在任何安全风险。所有的安全风险都来自付款环节。

交易是按照标准通讯协议非加密显示为二维码的,任何多余的信息或者不正确的信息会被立即发现。所以,不存在私钥泄露的风险。

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

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

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

6 通讯协议

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

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

 

申请同步 离线 指令 1   0xff
    币种 1  
    地址长度 1  
    地址 34/35   字符串格式的地址
    最后同步时间 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