比特币钱包安全
本文是有关比特币相关的系列文章,发布于GIT-HUB,地址如下:
https://github.com/junahan/JU...
比特币钱包安全概要
有关比特币钱包安全,可以简单的分为两类,一类是做为用户的你不可控制的安全问题,一类是做为用户的你可以控制的安全问题。之所以这样看似废话的区分,提醒你集中你的注意力在你可以控制的安全问题上。
要点提醒:确保比特币钱包安全的全部在于确保钱包私钥安全,好消息是,这个你可以采取措施。
你不能控制的安全问题
- 比特币选择的密码学算法安全问题,例如,比特币创世之初选择了采用SECP256K1算法,如果该算法失效,则会从根本上威胁比特币安全
- 51%算力攻击导致的交易安全问题,这个可能导致你收不到比特币,但不会导致你持有的比特币产生安全问题
你可以控制的安全问题
- 你可以选择使用那个钱包 - 比特币账本完全开放,任何人都可以构建一个支持比特币的钱包
- 你可以选择采用什么机制来存储和保护你的私钥,例如,你可以采用冷热存储或者分割和共享密钥的方式
- 你可以养成良好的使用钱包的习惯,例如,定期备份钱包、必要的时候及时将热钱包内的比特币转移到冷钱包等
比特币钱包安全机制
安全机制从来就是方便易用和安全可靠(防盗和防灾)之间的平衡机制。既然说确保钱包安全的全部在于确保私钥安全,那就把重点放在钱包如何存储私钥以确保它的安全上。下表是相关安全机制的一个简单的总结。
机制 | 易用性 | 可用性(1) | 安全性(2) |
---|---|---|---|
本地存储 | 高 | 低 | 低 |
冷热存储 | 中 | 中 | 中 |
分割和共享密钥 | 中 | 高 | 高 |
在线钱包 | 高 | 中(3) | 低(4) |
比特币交易所 | 高 | 中(5) | 中(6) |
- 可用性(Availablity): 和存储介质可能自然损坏有关,可以简单的理解为防灾,高可用性往往意味着更低的安全性,想一想你把私钥备份到公共网络上就明白了。
- 安全性(Security): 可简单的理解为防盗。
- 在线钱包的可用性取决于钱包提供方的服务能力。
- 在线钱包的安全性取决于钱包提供方的安全措施和信用,但很重要的是,做为用户的你要意识到钱包提供方存储你的密钥也意味着可以访问你的密钥。而且在线钱包供应商更有可能遭受黑客的攻击而导致客户钱包的损失。
- 使用比特币交易所服务就像你把钱存入银行一样,可谓是省心省力、方便易用。但其可用性取决于交易所的防灾能力。
- 对于使用比特币交易所的安全问题,不再是密钥的安全问题,而是你在比特币交易所账户的安全问题,你需要像信任银行一样信任交易所不破产、不跑路、不作恶。
本地存储
本地存储是一种最简单的方式,Bitcoin-qt钱包默认就是把产生的私钥存储在一个名字为keystore的本地文件里面,keystore文件的访问简单的通过用户指定密码保护。钱包被设计为最多产生和管理1000个密钥对(对大多数用户来说这不是问题),例如,每次交易中用于找零的地址就有对应的密钥对(为了隐私和安全的因素,每次找零地址都各不相同)。钱包应用管理所有产生的密钥对和地址并为用户统计相应地址中的比特币,比特币钱包里面看到的余额就是这些地址上所有比特币的总和。
使用本地存储方便快捷,但可用性和安全性均较差,也就是说,你既要防盗还要防灾才行,这种情况下,你最好定期备份keystore并确保将备份安全。
冷热存储
鉴于本地存储安全性的问题,我们希望能够在保留便利的情况下提升安全性。基本的思路是我们可以创建两个钱包,一个链接网络,可以发送和接受比特币,我们称之为热钱包,另外一个钱包从不连接网络(安全威胁更多来自网络),我们称之为冷钱包,热钱包知悉冷钱包地址,从而可以向冷钱包转移价值。这样以来,我们同时拥有热钱包的便利和冷钱包的安全。
考虑到隐私和安全问题,我们希望每次热钱包向冷钱包转移比特币的时候使用不同的地址,该地址需要和冷钱包相应的密钥对匹配,那么如何确保热钱包知道冷钱包的多个地址?答案是利用称之为分级密钥生成模式的密码学技巧,如下图所示:
- 分级密钥生成程序不直接生成密钥对,而是生成两段信息,一段是私钥生成信息,该信息存储于冷钱包这侧,另外一段是地址生成信息,该段信息传递给热钱包一侧。
- 在热钱包一侧,分级密钥生成程序使用地址生成信息和索引值“i”(一个整数)生成第“i”个地址。
- 在冷钱包一侧,分级密钥生成程序使用私钥生成信息和索引值“i”生成第“i”个私钥,并确保该私钥和热钱包一次第“i”个地址相匹配,这点至关重要,否则,就无法确保冷钱包用于该地址上的比特币。
- 密码学保证攻击者无法通过热钱包一次的地址生成信息推导出私钥生成信息及私钥,从而可以确保私钥的安全。
- 比特币使用的数字签名算法(ECDSA)支持分级密钥生成模式(这很重要)。
基于以上基本原理,我们可以设计如下几种冷热存储钱包:
- 分级钱包: 直接基于分级密钥生成模式打造,在这种方案中,冷钱包可以存放在不连网的PC/笔记本电脑上,也可以存放在不连接网络的移动设备上,并记得把它放在安全可靠的地方 - 注意防盗防灾。
大脑钱包: 基本原理是根据口令短语(一组足够长的词语组合)产生密钥对并结合分级密钥生成模式,我们可以基于口令短语生成一系列地址和相应的私钥。需要重点关注的是,私钥仅仅由口令短语保护:
- 为防止攻击者发起猜测攻击,口令短语需要足够长,要比Email口令和银行卡密码长的多才行。例如这样的口令短语 - "worn till alloy focusing okay reducing earth dutch fake tired dot occasions"。
- 同时要确保你的确能够记住口令短语(你也可以写下来并放在安全的地方,把它变成成一个简单的纸张钱包),否则你就无法重建私钥系列,从而永远丢失这些地址上的比特币。
- 纸张钱包: 和大脑钱包原理一样,如果你把口令短语打印在纸张上,大脑钱包就变成纸张钱包。不过,既然都要打印在纸上了,不妨直接把私钥和地址打印在纸上。在此提醒,请把纸张钱包放置在安全可靠的地方 - 注意防盗防灾。
共享密钥
我们说冷热存储可以提供更高的安全性(防网络攻击),但是却面临一个问题就是我们需要将冷私钥存储在介质上并好生照料介质以防止介质自然损坏(防灾)而导致低可用性。如果有办法同时提高可用性和安全性就再好不过了。答案是有,我们再一次利用密码学技巧 - 共享密钥来做到这一点。
简单的说,共享密钥允许将你的密钥分成N个碎片,只需要其中的K个碎片(K<=N)就可以恢复原始密钥,而且,如果只有少于K个碎片,则无法恢复原始密钥并切无法获得原始密钥的任何信息,这就是密钥共享的K-of-N模式。
这里需要提醒用户的是,这里的N个碎片只是个比喻,并非简单的把原始密钥串直接切成N个碎片。这里想到一个网络盛传高晓松2017年12月8日微博分享的故事(看下图),这个故事告诉我们,这个人脑2-of-2密码模式安全但可用性显然不行。
在线钱包
一个在线钱包类似于本地钱包,区别在于钱包信息存储于云端,可以通过Web浏览器或者是App访问。在线钱包很是便利,但它的安全不仅取决于在线钱包服务供应商(通常是比特币交易所)的安全措施,还取决于服务供应商的信誉:
在线钱包供应商安全措施:
- 是否提供类似本地存储的大脑钱包的机制,允许通过一个受复杂口令短语保护的冷钱包支持,让用户可以在本地通过该口令短语重建一个冷钱包,这样以来,用户只要在线使用一个受密码保护的热钱包,同时又能够在必要的时候把在线钱包的比特币及时转移至冷钱包地址。
- 网络防攻击 - 在线钱包供应商大量存放客户的钱包密钥信息,容易成为黑客攻击目标。
- 在线钱包供应商信誉: 供应商在云端存储你的密钥,他们至少有能力访问你的密钥!通常,类似于大脑钱包,你可以提供一个足够复杂的口令短语来加密和保护你的密钥,但你得信任供应商不会有意(作恶)或者无意(例如他们钱包的代码漏洞)泄漏你的密钥和口令短语。
比特币交易所
把比特币存在比特币交易所而不是自己的比特币钱包是另外一种选择,这个类比于把钱存进银行,你在比特币交易所的账户本质上已经不是比特币钱包账户,也无需担心自己比特币存储的问题。就像从银行取现到你的钱包一样,你也可以随时向比特币交易所要求提币,提币的过程就是将你的比特币从交易所账户转移至你自己的比特币钱包的过程。将比特币存进交易所,你可以无需在担心比特币钱包的安全问题,但你面临另外一个可能更加不安全的因素,那就是比特币交易所本身可能破产(就像银行破产一样),甚至比特币交易所卷币跑路的风险。
你可以采取的措施
- 选择钱包 - 尽可能选择官方的,开源的,具有高级安全选择(如支持冷热存储)的钱包。
- 使用更高级的安全防护,如采用冷热钱包,兼顾方便易用和安全
- 及时将不用的比特币从热钱包转移至冷钱包,如果只有口令短语保护的情况下,尽可能使用专业软件生成口令短语,不要使用过于简单的口令短语
参考文献
- Satoshi Nakamoto(中本聪),"Bitcoin: A Peer-to-Peer Electronic Cash System", http://www.bitcoin.org/en/bit..., 2009.
- Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, Steven Goldfeder, " Bitcoin and Cryptocurrency Technologies, 2016.
- BIP 32, "Hierarchical Deterministic Wallets", https://github.com/bitcoin/bi..., 2012.
本作品采用知识共享署名 4.0 国际许可协议进行许可。