万物皆是脑钱包

2015-10-27 16:50 来源:巴比特资讯 阅读:8201
币圈里过的时间总是很快,两周前写的关于脑钱包的帖子因为个人原因耽搁了一下,估计大家也都忘记得差不多了。尽管如此,还是将这篇文章发在这里,一方面提醒大家不要因为币价稍涨就忘记了买买提,另一方面,提币到自己的钱包里面也请注意不要忘记了经常检查一下,因为从某种意义上来说,所有的比特币钱包都是脑钱包。

brainwallet

币圈里过的时间总是很快,两周前写的关于脑钱包的帖子因为个人原因耽搁了一下,估计大家也都忘记得差不多了。尽管如此,还是将这篇文章发在这里,一方面提醒大家不要因为币价稍涨就忘记了买买提,另一方面,提币到自己的钱包里面也请注意不要忘记了经常检查一下,因为从某种意义上来说,所有的比特币钱包都是脑钱包。

如果还没有看过《Brainwallet.org 已死,脑钱包将永生!》这一系列帖子的同学,可以先回顾一下。

  1. http://www.8btc.com/long-live-brainwallet

  2. http://www.8btc.com/long-live-brainwallet-ii

  3. http://www.8btc.com/long-live-brainwallet-iii

这里,我们将从上次的测试开始说起。

测试结果

尽管在上一篇文章里笔者说的是有三个地址存有币,实际的结果是,共有四个地址是有币的。具体的交易信息在这里。

生成的语句见文末评论。几个小改动的地方如下(或许破解者自己都没有注意到……):

  1. 部分引号中的内容本身已包含有一个空格。

  2. 部分地址生成时用的是压缩格式而非默认的非压缩格式。

  3. 青楼变红楼。

本次测试从文章发布到最后全部被破解,所花的时间正好一天。虽然不知道具体猜出来的两位用户花了多少时间,不过从几次取走的时间来看,应该花了不止十几分钟。虽然笔者的确试图增加一些混淆,不过在严格遵守所说的规则情况下,如果通过程序来找出来的话,其实一秒钟都不需要。

之所以做这个试验,是因为在一年前笔者的确用中文短语直接生成过部分脑钱包并存币于内。后来发现,这点沾沾自喜小聪明其实在暴力破解前面完全就是然并卵,随后就将部分转至了用 Git commit ID 与个人信息组合生成的脑钱包里。这样做是否足够安全了呢?或许下面的概念能让你更好的去评估。

信息熵

信息是个很抽象的概念。我们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少,比如一本五十万字的中文书到底有多少信息量。直到 1948 年,香农提出了“信息熵”(shāng) 的概念,才解决了对信息的量化度量问题。

在信息论中,熵是接收的每条消息中包含的信息的平均量。实际上,熵的大小与事件出现的概率息息相关。事件的概率分布和每个事件的信息量构成了一个随机变量,这个随机变量的均值(即期望)就是这个分布产生的信息量的平均值(即熵)。假设有一枚“理想”的硬币(抛出正面和反面的几率相等),每一次抛硬币都是独立的、不可预测的,其结果不是正面、就是反面( 0 和 1 ),那么这个抛硬币事件的熵就是 1 个比特/位,抛 256 次的熵就是 256 个比特/位。而这,将会是一个完美的比特币私钥。

对于所生成的每一个比特币私钥,其生成方式的熵的大小是否足够大是衡量其是否安全的一个重要指标。但是,在计算机的世界里,所有的随机数产生器都是伪随机,这就意味着黑客有可能通过刻意的方式,模拟并生成相同的私钥。在这一点上,Blockchain.info 就吃过大亏。

在这一方面,国内的比太钱包团队曾经做过不少科普(具体见文1、文2、文3),其钱包在生成私钥时会要求用户打开摄像头和麦克风以从用户周围的环境获取信息以得到更高的随机性,以便生成的私钥的熵更大。

而脑钱包的熵能有多大呢?在这一点上,阐述得最明确的是  Vitalik Buterin 的博文《An Information-Theoretic Account of Secure Brainwallets》。巴比特曾将其翻译成中文,但翻译有部分错误,推荐有能力的同学直接看原文。

文中最终结论是,从目前的情况来看,280 是可接受的最小安全水平。而要拥有 80 位熵,你需要约 17 个随机英文字母或 12 个随机字母、数字和符号的组合。单纯从字面上看,上一篇文章所提到的「加长输入的长度」、「使用扩展字符集」等建议,是可以轻松满足这个条件的。

但是,用户是否真的如此有把握,能够让能够让自己所构建的输入信息足够随机?很遗憾,这几乎是不可能的任务。受限于人类文化的限制,纵使有着浩如烟海的书海,大部分人脑海中所能想到的词汇其实只是其中很小的一个子集。在计算机硬件飞速提升以及机器学习能力日益增强的情况下,如果输入的短语长度不够,或者语义过于容易记忆,被暴力破解将是不可避免的事情。

因此,直接输入一串常用单词组成的短语来当作脑钱包,是非常不安全的。从这一点上来说,Brainwallet.org 死得并不冤枉。

确定性

如果说直接用常用的词组来组成的脑钱包难以逃脱黑客无特定目标的暴力破解的话,在生成脑钱包时通过「添加个人专属信息」、「对输入进行加密转换」等方式来处理的话,在一定的程度上可以生成十分”复杂“的脑钱包,因为这相当于给这个脑钱包增加了一些不确定性(Deterministic)。

但这种用户刻意增加的步骤,其实并没有改变所生成的脑钱包是已经确定了(Determined)的本质。此时黑客要想攻破这样的脑钱包,不仅需要构建相同的输入,同时还需要知晓用户对原始输入的操作步骤。虽然针对某个地址的个性化攻击通常成本很高,但在币价高涨而且确定某个地址里数量颇多的币确属于某个人的时候,通过一些社交工程进行定向分析并破解绝非匪夷所思。

举个例子,假如用户通过 SHA256("a") 去掉后三位得到的字符串ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee4 看上去似乎十分复杂,要想直接通过暴力穷举这个字符串难度也的确难度很大。但如果攻击者通过监视日志和上网记录等方式,判断出用户在交易前都有用在线工具计算 SHA256 值的习惯后,尝试碰撞并成功的概率则不可忽视。

虽然用户确实可以通过对上面的结果再通过某种方式进行二次加工以降低被破解的可能性,但这并没有解决上述的问题,只不过是隐藏得更深一些而已。而在这种情况下,脑钱包的安全性将不仅取决于用户所使用的方法的复杂度,还将依赖于用户是否有足够的记忆力去清楚地记住生成的步骤。虽然自定义的步骤越多的确破解的可能性就越小,但笔者以长者的身份告诉你,这种繁琐的步骤,最终将往往成为你再次解锁该地址的阻碍。

这就是所有脑钱包的悲剧根源,既然它是确定性的,可以从你的脑海映射到具体的比特币地址上,也就意味着他人在知晓你的输入内容及生成方式的情况下,能够如法泡制生成相同的私钥。虽然用户可以努力防护好自己,但这份与生俱来的原罪,如同一把达摩克利斯之剑,无时不刻不悬挂在每一个存有币的脑钱包地址上。

值得一提的是,虽然脑钱包工具无法避免上面的根本问题所带来的尴尬,但事实上可以通过另一种方式来缓解被暴力破解的情况。其做法是通过多次重复执行算法固定的运算,增加生成结果的复杂度的同时,也增加了生成脑钱包所需的时间。对于用户而言,生成一个脑钱包地址时需要花费 2ms 和花费 200ms 似乎没有太大的差别,但对于暴力破解的程序来说,速度就这样活生生地拖慢至原先的百分之一。有兴趣的同学可以自行到 Keybase.io 所提供的 Wrap 钱包体验一下。(话说我似乎还有 Keybase.io 的邀请,10mBTC/枚出售,有兴趣的同学快私信我吧哈哈哈。)

万物皆是脑钱包

既然脑钱包的问题根源是因为其有着确定性的根源、可以被单向推导而出造成的,那么换用具有不确定性的生成算法,是否就能解决这问题了?

这个问题,回答是,但回答又不是。

诚然,从密码学安全的角度来说,通过引入了用户环境的随机变量,攻击者即使知道其使用的加密方法,但因无法重现用户生成私钥时的运行环境,因此无法将其攻破。但纵使比特币地址的数量如同浩瀚星海,当用户最终弱水三千只取一瓢确定下想要使用的比特币地址时,其私钥亦已尘埃落定,无法更改。因为最终,每一个比特币私钥都将确定无疑。

如果说通过在 Brainwallet.org 输入一串短语所得到的比特币私钥是传统意义上的脑钱包的话,广义上的脑钱包,指的是用户通过自己的记忆,采取各种方式获得对比特币私钥控制权的能力。而对于每一个将要被使用的比特币私钥,事实上都必须通过使用者的脑力转换,才可能将其解锁。

不相信是吗?那我们聊聊看:

我用的是 Bitcoin Core 随机生成的钱包。

你其实需要记住对 wallet.dat 加密的密码,而且还可能需要定期备份该文件,并记得它存在哪个文件夹里面。

我用的是 Electrum 离线生成的钱包地址。

它应该让你做备份了吧?那十几个随机单词的生成方式和我上一篇文章介绍的是相同的。而且你不仅需要记下这十几个单词,还需要记住是用什么软件生成的以便能重新导入。

我用的是 Vanitygen 自己生成的私钥。

然后这私钥你是记在脑海里面还是记在本子里面了?用没有用 BIP38 加密?加密的密码记下来了么?

我用的是硬件钱包,它支持指纹识别,我完全不需要密码!

你其实还是需要记住你用的是那个硬件钱包,它放在哪里,以及你是用哪一根指头去进行识别的……

我的比特币都放在交易所网站上,比特币密码神马的我都不知道!

其实存在交易所里的比特币都已经不再属于你的了,你拿到的只是别人给你的一张 IOU 而已。快去下载一个比太钱包把币存起来吧!

因此,虽然每一个比特币私钥只是短短的几十个字符,其存储媒介和获取方式由于使用者的不同而存在着诸多差异。

人类对于物理媒介的管理要比数字化信息的管理要在行得多,很多时候只需要将私钥打印在纸张上,然后锁在保险箱里即可。这时候对私钥的管理其实降纬成了对纸钱包保存位置的记忆,而这样的物理隔离,使得私钥的一免受暴力穷举的攻击,毕竟黑客不太可能登门入室进行劫取。不过这在增加使用不便的同时,其实也加大了私钥备份维护的负担。否则在火灾洪水等意外灾难来临之时,存在里面的比特币也将一同化为乌有。

写到这里,想必各位读者也已经能明白,对于比特币的存储,没有一种方法是一劳永逸的。传统的脑钱包在方便了自己的同时,也给了黑客可乘之机;而通过软件生成的地址,无法在急需的时候能迅速使用,还可能因为天灾人祸而毁于一旦。

因此,更重要的是,需要根据不同的存储方式的特点,选择合适的方式来进行托管。

  1. 对于日常使用的小额比特币,可以用手机软件随机生成地址存储,不过请不要忘记支付密码。

  2. 对于储值用的大额比特币,可以用软件在离线环境下生成地址存储,不过请不要忘记备份所保存的位置。

  3. 对于部分暂时不用但希望能在某天用来应急的比特币,可以用脑钱包生成存储,不过切记需要混淆输入的内容,加入个人信息,并使用类似 WrapWallet 这样的脑钱包工具进行多次运算以增加破解难度。

  4. 可能的话,使用多签名地址。我就是用脑钱包生成的私钥来构建多签名地址保存 ,可惜没有找到支持自行导入多签名 RedeemScript 的软件。

写到这里,终于可以应一下本系列文章的题目了:Brainwallet.org 已死,脑钱包将永生。好好记住你是如何管理每一个比特币地址的吧!因为除了你,或许谁也无法再将其重现。


声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文