今天有空顺手写一个关于如何通过BIP39-dotmap协议来获得真正意义上足够“冷”的“助记词(mnemonics)”相关的攻略,正好赶上前些日子 @0x_Todd老哥写了一版标准Bip39协议的攻略,我刚好在他的基础上再写一个更加易操作基于BIP39-dotmap的版本!
引子:先抛一个问题就是你目前的硬件钱包真的安全么?其实:无论是热钱包还是硬件钱包,你所拿到的助记词都是软件通过随机自动帮你生成的。
是否真随机没人可以保证,即使对硬件钱包厂商足够的信任,但作为一个crypto native guy,我觉得单纯靠“信任”是不够的。
为什么这么说呢?从一台硬件钱包从生产到你手中,经历了太多的环节:开发者、硬件设计、组装商、包装商、快递A,海关,分拣,快递B… 等等。
最差情况是:自动生成的随机算法,是破解版,或者干脆带有后门。
大家都听说过“伪随机”的概念,机器生成的随机数,终究存在被人预测的可能性。比如你用了别人送你的(动过手脚的)硬件钱包,那理论上,你生成的12个单词,别人也能生成相同的,那你硬件防护手段也就失去了意义。
所以,我们最好自己亲自生成一套助记词,而不是借助程序自动生成。
真正的硬件钱包是无法访问网络的,这个环节是很难植入后门的,所以只要你能确保你的助记词是真·随机生成的,其他人没有机会接触到你的硬件钱包,那么你的硬件钱包的安全性将会补足最后一块短板,即没人可以知道你的助记词。
那么如何生成真·随机的助记词呢?很简单:物理随机!
我们首先科普一个概念:比特币也好,以太坊也好,以及后面的所有链,用的都是同一套协议,即比特币社区当年创造的BIP-39。这里有2048个单词,而且为了避免手写抄错,BIP-39还贴心去掉了很多看起来很相似的单词。而今天要用到的BIP39-dotmap更加优化的方便将助记词转化为了12*12点阵图,这样一来使用12个0或1(空白或填充)的点就可以方便的记录你的助记词短语。
12个点代表: 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1
例如:
63 amazing = 32, 16, 8, 4, 2, 1 | ○ ○ ○ ○ | ○ ○ ● ● | ● ● ● ● |
977 key = 512 + 256 + 128 + 64 + 16 + 1 | ○ ○ ● ● | ● ● ○ ● | ○ ○ ○ ● |
所以我们实际操作一共需要5步:
1.找到BIP39-dotmap助记词列表链接:https://github.com/OneKeyHQ/bip39-dotmap
以及打印或者画一个Dotmap记录表格
如下图:
2.找个真二项随机物品例如:
骰子(奇数记为1偶数记为0)
硬币(正面为1反面为0)
或制作一个有两个扇区的转盘例如一个有红色1和绿色0两个扇区的转盘再或者其他你能找的其他任何真二项随机物品。
3.随机抛掷骰子、硬币或是转盘来产生二项随机结果并且做好记录。
12次抛掷为一组即为一个助记词!
例如:
摇出一组12次的结果是10111001011转换十进制就是1483然后到上面助记词列表中找到第1483个单词
二进制转十进制算法很简单,用纸笔算就可以(这里不要用电脑,私钥不要触网),算法不会可参考:
https://zhuanlan.zhihu.com/p/75291280
12位助记词需要抛掷11组132次
加1组12次(穷举法开始位置)
24位助记词需要抛掷23组276次
加1组12次(穷举法开始位置)
4.使用穷举法获得最后一个检验单词即校验位此,(为什么不一口气把12个单词全部用骰子掷出来呢?因为BIP-39整个助记词序列包含了一定程度的校验功能,类似于身份证的尾号也有类似的设计,因此:尽管第12个单词本身并不是一个特殊的校验位,但考虑到整套助记词序列确实要符合一定的规则,因此在创建钱包时,如果输入的助记词不符合校验规则,创建将会失败。
再通俗一点说:并不是表上的任意12个单词,都可以组成一套助记词的,它们必须符合某种规则。你随便找一套单词,大概率会提示你:无效助记词)
如果是程序自动生生成的助记词,当然自动符合了协议规则但我们是物理创建的,因此,需要再次动一些脑筋。
很简单,既然前面11个都没按照规则,那么,我们让第12个(24个)助记词符合就行了。
所以这里就需要使用“暴力”穷举法来找到这个第十二个单词!(哈哈!没想到吧,自己创建的助记词还需要暴力破解)事实上,你在2048个助记词列表随机任何一个位置(这里可以再投掷一组12位二进制数出来找到开始的位置),然后往下尝试0-30个,必定有一个符合规则的单词。比如我说这组,我从第230个单词开始试,233 brown就可以,255 cabin也可以。
当然,如果在硬件钱包上直接尝试破解,是最好的,毕竟不触网。但是缺点是会比较累,大部分硬件钱包按钮很少例如ledger Nano S这穷举一套下来会被累死累瞎的!
哈哈哈哈哈
我这里用的是@ohYishi 老板的OneKey 的旗舰款冷钱包Onekey touch因为是大屏还是触屏所以很轻松就搞定了!
但如果手边没有类似方便的冷钱包设备那怎么办?
没事我们有办法那就是找一个退役的手机越便宜越好越破越好能开机装app就行,没有就去淘宝拼多多买一个30 40块钱的就行,然后安装一个MetaMusk或者TrustWallet或者任何一个你熟悉的钱包然后断网(必须断网!必须断网!必须断网!并且完事之后也不要再链接网络!),轮流测试。直到试出符合规则的第12(24)个单词,默默记下,然后接着删除这个App,随便复制一下什么东西(清除剪贴板),重启关机几次,我建议是一次性多生成几套助记词后物理销毁这台硬件设备。
5.助记词内容校对,二次核对!备份!
然后销毁所有非正式纸质记录信息!
上面的方法如果是拿来作为冷钱包并且当长期holder,其实写在纸上并把这个地址copy出来,做到只进不出,满满甚至不需要一个硬件钱包了,这也是早年大家常提到的“纸钱包”。
最后,祝大家都能永远保护好自己的钱包和资产。有任何问题或者想发改进物理随机的方式,备份储存的方式都欢迎一起讨论!