这其实是一份姗姗来迟的文章,阐述了笔者个人对脑钱包的一些看法。尽管原作者因安全原因将 brainwallet.org 关闭,但笔者认为脑钱包有其存在的意义和研究价值。在上一篇文章里面从原理上分析脑钱包的安全性,本篇将分享部分“可行”的脑钱包生成方案。首先感谢读者对前两篇文章打赏支持,本文以飧读者,包含了几个小彩蛋,欢迎大家挖掘。
前两篇说了这么多,是时候开始进入脑钱包的使用实战了。在出征前,有必要重温一下脑钱包的安全使用军规:
“安全的根本,是时刻记住,没有任何东西是绝对安全的。 ”
- @imcoddy
安全,永远是一个讨论起来就永无止境的话题。如果你认真看完前面的两篇文章,到现在应该已经清楚地明白上面这个观点了。
虽然绝对的安全无法获取,但对大部分人而言,相对的安全在很多时候已经足够。既然 Brainwallet.org 在原理上并没有太大的问题,如果想要通过它来使用好脑钱包,享受其所带来的便利的话,那么问题就变成了这个:如何构建一个独一无二的输入?
下面这些笔者的个人经验,或许能给你带来一些启发。
要想“正确”地使用好脑钱包,下面的一些个人经验,是很好的参考对象:
首先出一道小测试题。下面的两个短语,哪一个用来做脑钱包安全性会更高?
D0g!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
PrXyc.N(n4k77#L!eVdAfp9
这里面的小把戏如果用等宽字体显示就会很容易看出来。前者是英文单词“dog”的简单变形再加上 30 个感叹号,而后者则是一般人记不住的由 23 个字符组成的乱码。虽然对人类而言前者虽长但却容易记忆,对计算机而言,两者其实只是不同长度的字符串。而要通过穷举的方式构造一个相同的字符串的话,所需要花费的时候将根据长度的增加而指数增长。
但在经过了这么多年的网站注册登陆教育后,许多人都已经习惯了将密码设置为不超过 16 位长度,甚至有的人还只使用不超过十位的纯数字当密码。这一点,是使用脑钱包的新手最容易犯的错误。如果说设置网站密码时不能超过 16 位还情有可原(其实这也是这个网站过于懒惰,一切明码存储用户密码的网站都是流氓。更合理的做法是对用户密码进行哈希计算然后保存 hash 值,而这样做之后所有的密码最终存储都是定长的,完全不需要限制用户的输入长度),但对于脑钱包这样可以输入无限字符的工具,仅仅输入十几个字母就拿来用无异于将里面的币拱手相让。
因此,与其瞑思苦想去构建一个长度限定的复杂密码,不如想一个别人难以想到的长句子。这里说句题外话,将上面的过程反过来,通过一个好记的长句子,其实可以生成一个好密码,这正是笔者前阵子编写的 PassworK 的原理所在,这个工具的论坛讨论帖在此,欢迎有兴趣的同学围观。
可以说,现在针对脑钱包的攻击大都是基于 ASCII 码的,这一方面是因为脑钱包出现时外文资料贫乏,活跃的基本都是英文玩家;另一方面,与不超过 256 个字符的 ASCII 码字符集相比,针对非标准字符集生成的脑钱包的暴力攻击难度直接提升了若干倍。
这对于中文玩家,可谓是一个福音。虽然中文常用字数量与英文常用词汇相比偏低(大陆常用字为 2500 字,香港 4759 字,台湾 4808 字。信息来源),但字字相组成词后,所能表达的意思远大于相同长度的其它语言。
如果对上面的这句话不太好理解的话,看完下面的例子或许你就能豁然开朗了:
The king is always lucky——王老吉;
The king is kept justice——王守义;
The king is lead to peace——王致和;
The king from the sky——王天来。
这意味着什么?这意味着在相同长度的输入里,中文可以拥有更多的信息量。纵使许多人对重复输入一模一样的几百字长文或许稍有难度,但完全无误地输入十几个相同的汉字通常都不会有问题。而用十个汉字组成的一个有意义的短句所生成的脑钱包,要破解的难度就可能比十个英文单词生成的更大。
十几个汉字很难构造吗?写到这里,笔者顿时觉得“文思似泉涌,下笔如尿崩。”想来年少时曾受中华文化目濡目染,神马唐诗宋词还不是信手拈来?且看本湿人呤来!
“一朝被蛇咬,处处闻啼鸟。”
“两岸猿声啼不住,一枝红杏出墙来。”
“在天愿作比翼鸟,大难临头各自飞。 ”
“问君能有几多愁,恰似一群太监上青楼。”
“红酥手,黄滕酒,两个黄鹂鸣翠柳。长亭外,古道边,一行白鹭上青天。”
……
当然,要是觉得才思枯竭一时想不出什么好句子,这也简单。随便找一段话复制粘贴出来不也是很简单的事情嘛。
例如巴比特站长长铗对本文的评论是这样的:
“很有趣,脑钱包就像是火,对人猿来说,它是危险的玩物,但对智人来说,它是可驾驭的工具。”
币科技活跃人士超级君的评论则是这样:
“之前对脑钱包并不大感冒,这篇文章给出了脉络清晰的脑钱包历史,有论点有史料,作者还动手,延续脑钱包的产品,真是比特币极客党派。已赞。”
只要上面的网站能访问,该评论未被删除,你就可以找到这两段原话,然后用来生成脑钱包。
等等,脑钱包不是不应该用网上可以找到的语句吗?如果你产生了这样的疑惑,那么恭喜你,你还没有忘记一开始所说的安全军规!虽然像中本聪这样大隐隐地市让吾等无尽感慨,试图将比特币隐藏于网络上的只言片语的做法往往得不偿失。虽然如此,笔者打算以此为契机尝试一下,作为给刚看到本文的读者的福利:
通过上文每一对双引号中的内容所生成的脑钱包地址里,有三个并不是空的。
生成脑钱包的网址为:http://brainwallet.herokuapp.com/
注意,在生成脑钱包时所用的短语为双引号中全部内容并加上一个半角空格。因此,“一朝被蛇咬,处处闻啼鸟。”所生成的地址并不是 13DuS9tSRuXtS13P11pJSFRq25VuDG33kT。
其中的一个脑钱包中的颜色的汉字被换成了另外一种颜色的汉字。
若干小陷阱,且看君人品。
成功找到的同学请自行取走,然后留言告之并宣布正确答案吧~
最后,关于此节里值得一提的是,采用扩大字符集会有潜在风险:你可能无法在一台离线的设备上输入非英文字符(例如有些人可能会用 Live USB 启动一个 Ubuntu 系统而里面并没有安装默认安装中文字库),或者不同的系统对 UTF-8 的支持不同造成在不同的机器上输入有差异,以至于生成的地址不一致。
如果你没有马上去找上面奖励而是继续往下看,那真是儒子可教。因为对于这种明码放出来的脑钱包,是使用脑钱包的大忌。脑钱包的破解其实是一个见招拆招的过程,虽然上面吟诵的几句都是混搭而非原作,他人的评论亦可认为是一个随机产生的结果,但像上面这样将规则公布于众之后,就相当于将里面的比特币拱手相让了,虽然笔者的确是在送比特币 :P
要想生成一个足够安全的脑钱包,对其输入的内容进行混淆是必不可少 。而混淆的方式,则可以有千万多种。
这包括但不限于你的名字,身高,住址,邮箱等个人信息。这一点的好处是对于自己而言输入并不是难事,但在输入里面增加这些个人信息后,那些无具体针对目标的脑钱包攻击将大部分失效。因为他们的词汇表里面没有你的个人信息,也就无法构建相同的输入。
例如我曾经用过的一个例子是之前所用的 iPhone 4S 手机的序列号,或许知道这信息的只有我电脑上的 iTunes,以及我的 Gmail 邮箱。
在确定输入的内容后,对输入的内容进行加密转换。这个方式有许多种,你可以选择现有的加密算法,可以自己制定规则,甚至只是改变一下系统设置。
比如说,如果想以“A brainwallet has two sides”来生成脑钱包,下面举两个加密转换的例子。
1,对于每个长度大于 1 的单词,删除最后一个字母。即得到 A brainwalle ha tw side
,用其生成的脑钱包为12kXjcVD22FpQLmy9TYAr1fnUCMpeQMjXP
2、先切换到 Converter 页,在 Source Text 框输入 A brainwallet has two sides
,设置从 Text 输入转换成 Poetry 输出,结果为waist easily grasp hunger grab taint slide walk gather slam church concrete world passion shimmer mostly heel house people dig form
。将其作为脑钱包输入,得到1HQDUbP5YNZKvhJ4tCvq7t8FGbSb38snWG
。
上面的两个方法,都是对原始输入多进行了一次加工转换。相比前一种手动删除字母容易出错,个人更喜欢后者。这也是笔者将 Brainwallet.org 重新上线的原因。但这并不意味着后者一定比前者安全,因为后者的算法是固定并公开的,而前者的做法更多是用户一时兴起的做法,但在某些场合里说不定会有无招胜有招的效果。
至此,如果读者能意识到自己在脑钱包输入框里输入的内容自己也记不住时,你对脑钱包的理解就得到了升华:你并不一定需要记住最后输入的内容,你需要清楚记住的是你所输入的内容的生成方式。
值得一提的是,这个使用 Converter 进行的转换并不会增加输入的信息熵。在上一篇文章里,@ahr999 就指出了这一点。事实的确如此,单纯的执行 Hash 函数并不会使信息熵增加,但对于他人而言,用户在选择 Hash 算法这个操作上会使信息熵增加,因为这要求攻击者知晓被攻击者所采用的生成方式的信息。
关于熵的概念及进一步讨论将在下一篇文章里面说明。如果你还没有猜出上面的彩蛋的话,不妨去试一试吧。大家对上面脑钱包的破解所花的时间,将成为下一篇文章的参考。
声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。