Brainwallet.org 已死,脑钱包将永生II:原理

巴比特 view 43 2015-10-10 09:20
share to
Scan QR code with WeChat

这其实是一份姗姗来迟的文章,阐述了笔者个人对脑钱包的一些看法。尽管原作者因安全原因将 brainwallet.org 关闭,但笔者认为脑钱包有其存在的意义和研究价值。在上一篇文章里面介绍了脑钱包的相关知识以及 Brainwallet.org 从诞生到关闭的过程。在本篇里,将从原理上分析脑钱包的安全性。

Brainwallet.org 已死,脑钱包将永生II:原理

比特币私钥

Brainwallet.org 已死,脑钱包将永生II:原理

要分析脑钱包的安全性,首先要从比特币私钥的生成原理开始说起。以下部分大量参考了《Mastering Bitcoin》一书的相关章节,想了解更详细的读者请自行查阅。

比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户以某种方式生成并存储在某个地方。它完全独立于比特币协议,亦无需区块链数据或网络连接。

每个密钥对包括一个私钥和一个公钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆曲线乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。

Brainwallet.org 已死,脑钱包将永生II:原理

大多数比特币钱包工具为了方便,会将私钥和公钥以密钥对的形式存储在一起。实际上,比特币公钥可以由私钥计算推导得出,所以只存储私钥也是可以的。这一点,正是脑钱包能确保相同输入会生成相同输出的基础。

而比特币私钥,实际上只是一个随机选出的数字而已。你甚至可以完全不用电子设备,单纯用硬币、铅笔和纸来随机生成你的私钥:拿一枚硬币,重复抛 256 次,每次用纸和笔记录正反面并转换为 0 和 1 ,然后这一串随机得到的 256 位二进制数字即可作为比特币钱包的私钥。有好事者就曾经将自己的操作经历拍成视频放到了 Youtube 上,并“好心”地向里面放了一些比特币让有心人去领取。

事实上,作为一个比特币爱好者,笔者强烈建议大家去亲自尝试一下手工生成比特币私钥这一过程。然后你会深刻地感受到,虽然 256 次抛硬币看起来并不是太艰难,但这过程实在是无聊至极:P

另外多说一句,即使真的拿一枚硬币抛上几百次,得到的结果也不一定能保证足够随机。因为受现实物质世界的影响,这枚硬币最后是正面还是反面的概率无法达到完全相等的五五平开。正如理想的直线的宽度为零一样,真正的随机数只存在于理论里。知乎上这篇文章和这篇文章对此有所说明。

脑钱包的生成原理

在上面抛硬币的实验中,有一个常识或许是很多人难以意识到的:如果你没有将抛硬币所得到的私钥保存下来的话,你这一生都将无法再次遇到它。因为对于 2^n 这一个指数级增长的函数而言,要想从 2^256 这个集合中随机抽取两次并期望所得结果相同的概率接近为零。

这或许成了不少早期比特币玩家无限懊悔的根源,在那个默认使用找零地址时常需要备份密钥的年代,有多少币只因玩家一时疏忽就从此永远埋没。虽然笔者没有看到较详尽的丢币统计,毕竟地址上的币是丢失了还是暂时尘封在区块链上是完全无法区分,但个人认为,在币价低廉的初期,因用户的操作失误而无法重见天日的比特币或许比大多数人估计的都要多得多。因此,对于每个擦身而过转瞬即逝的私钥,笔者只想说一句:且生成且珍惜。

Brainwallet.org 在某种意义上缓解了这个尴尬的局面。相对于难以记忆的一长串 0 和 1,用户通过输入自行编写的一串字符串,即可与一个固定的密钥生成一一对应的映射。其采用的算法其实很简单,通过对用户的输入进行一次 SHA256 操作,然后将生成的 256 位 hash 值作为私钥,其具体的代码如下:

function calc_hash() {

   var hash = Crypto.SHA256($('#pass').val(), { asBytes: true });

   $('#hash').val(Crypto.util.bytesToHex(hash));

}

Brainwallet.org 已死,脑钱包将永生II:原理

巴 比特去年翻译的《比特币地址生成(图形化)》一文其实介绍的就是 Brainwallet.org 的生成方式。实际上,各个比特币软件在生成地址时,除了第一步中选取随机数时采用的方式可能稍有不同之外,后面的步骤完全相同。

因此,单纯从实现上来说,Brainwallet.org 做得也是无可厚非。毕竟 SHA256 算法目前还是安全的,比特币在内部实现时也大量使用,其生成的 hash 值也的确分布得足够分散。那么,为什么脑钱包自上线以来一直受到这么多安全指责呢?答案已经是不言自明了,这里面最脆弱的不是别的,正是在“Type passphrase here...”里输入的短语,以及输入这个短语的人。

因此,从这个角度而言,单纯地指责脑钱包不安全是不负责任的,因为在一条不结实的安全长链里面,其牢固程度取决于最脆弱的一环。而与计算机准确无误地按照指示执行命令相比,因用户操作而出错的概率要远远大得多。拿电脑系统来举例,现代的操作系统在用户权限管理上其实已经非常完善,如果能将自己置于受限帐户下,日常使用基本很难感染病毒。但还是有许多人贪图方便直接使用管理员账户,从而不小心被植木马的事情屡见不鲜。

但从另一个角度来说,脑钱包的确非常不安全。由于 Brainwallet.org 的算法透明公开(毕竟算法不透明的话是不会有人用的),整个流程的安全性完全取决于用户自身的安全意识。在这一点上, Brainwallet.org 向用户暴露了一个过于开放的接口,这虽然方便了用户,也带来了严重的安全隐患。

如果说要通过获取 wallet.dat 来盗币需要先通过种植木马及破解密码(如果钱包加密过的话)这两道关卡,将比特币存在脑钱包里就像将现金放在街头的公共储蓄箱里面,而且你无法阻止别人不时过来将其打开看看里面是否有币。更关键的一点是,这些不时过来打开箱子查看的人并不是针对某个个体,而是通过分析统计找出那些最可能被使用的箱子,然后飞速地确认并将里面的币收入囊中。

只有充分理解上面这个例子的人,才有资格使用脑钱包。因为他会明白,此时要做的是找到一个不容易被他人发现而只有自己知道的箱子,才能安心地把东西放进去。幸运的是,能明白这点的人通常都会放弃自行生成比特币地址而是通过软件代劳,因为那样才能获得更好的随机性。而如果你依然“执迷不悟”的坚持想要使用 Brainwallet.org 来生成的话,笔者觉得有必要在下一篇文章里给你传授一些人生经验。

为了刺激笔者更好地写下一篇,欢迎打赏:1873PE9v17hZcAHPmBVufTAWVEhkunLoV3 ^_^

币科技首发,欢迎将比特币砸过来~

btcfans公众号

Scan QR code with WeChat

Disclaimer:

Previous: BitPay与法国安智公司共推比特币POS机 Next: 一家反水比特币汇款公司获得85万美元融资

Related