用骰子DIY真随机助记词 | 冰川协议
来源:雪球App,作者: Cobo钱包,(https://xueqiu.com/6966234441/144668571)
—
撰文 | 大掌柜
切入正题之前,掌柜想给大家介绍一下 冰川协议 (Glacier Protocol),也就是本篇教程的出处。
冰川协议是一套完备的冷存储方案,是一本足足78页的PDF操作手册。操作手册彻底践行了“not your keys, not your bitcoin”的理念,介绍了如何在尽可能不信任任一第三方的情况下,生成你自己的随机数,助记词,私钥,公钥,助记词;进而如何进行转币等操作。
为了能够做到“尽可能不信任某一第三方”,冰川协议对具体的实施进行了非常严格的规定:
比如,为了避免黑客远程攻击,保存私钥和进行签名的电脑必须是完全脱网的,冰川协议要求 移除或者破坏掉电脑的网卡 ,这一点可能安全意识比较强的同学自己也能想到并付诸实践。
但是冰川协议的其他设定就有一点点“被害妄想症”了:
比如,为了减少对某一第三方节点的信任,冰川协议要求用户一定要 自己维护全节点 ;
比如,为了避免使用某一台电脑保存私钥和使用其签名时被安装了后门,冰川协议要求购买两台不同品牌甚至不同操作系统的全新电脑(比如一台Windows,一台Mac), 交叉验证两台电脑得到的结果再广播交易 ;
比如,在操作电脑时,为了避免电脑向外辐射的电磁波会泄露信息,冰川协议要求使用电脑时一定要用一个大的 法拉第包 把电脑罩住,并且要用另一台设备(比如离线手机)连续播放宽频的 白噪音 。
虽然冰川协议规定了大量的操作细节,但是因为这些流程一是要求用户有很强的动手能力,其次要做到足够的心细,才能在操作中不犯错。 要知道,人为失误是除了设备故障或者被黑之外,最大的丢币原因,没有之一。 所以,掌柜并不建议新手用户使用冰川协议来保护你的私钥和做交易签名。
但是,冰川协议里面也有一些我们可以借鉴的部分。比如, 用掷骰子的方式来生成你的助记词 。这样做的好处是,避免了信任软件HD钱包的伪随机数生成器,甚至是硬件钱包的安全芯片。通过手工的方式生成真随机数,进而保障私钥的随机性。
这里需要注意,因为普通骰子的六个面的重量不一致,从而会导致得到的随机熵值的概率不是严格的平均分布,掌柜的建议大家一定要使用六个面重量几乎完全一样的赌chang级骰子。
切入正题。
如何用骰子生成助记词
准备工具:
① 一颗赌chang级骰子
- 如何离线使用工具?联网电脑打开链接,右键菜单“另存为”文件,将文件拷贝到离线电脑,双击打开文件进行使用。
③ BIP39- 2048助记词表
④ 纸笔或金属助记板
开始操作:
第一步,我们需要用到 骰子 和 纸笔 。
一共掷256次骰子,掷到1,2,3记录为0,掷到4,5,6记录为1,最终得到256位二进制数。
或者,利用 进制转换工具 ,掷99次,把得到的记录作为六进制数据,然后转换为二进制,就可以得到一个256位的二进制数。
256位二进制:1100 0011 0110 0100 0001 1111 1000 0101 0100 0100 1101 0111 1100 0000 0010 1111 0011 0101 1000 0000 1011 0000 0111 1100 0000 1111 1001 1000 1000 0111 1111 0000 1100 0110 1010 0010 0111 1111 1111 0101 1010 1011 0001 1101 0100 1010 0011 1110 0010 1001 1100 1010 1111 0001 1001 0111 1100 1111 1100 0010 1001 1001 1010 1110
操作过程中要确保骰子在空中得到足够的翻转,并且避免总是从骰子的特定面朝上进行投掷。
当然,如果你坚持要用筛盅,掌柜也不会拦着你。
第二步,我们需要用到 SHA256算法工具 。
1. 使用 SHA256 工具获取256位二进制的Hash值(转换为二进制,按Byte分组),取前面8位加到256位二进制后面,得到264位二进制数。
264位二进制:1100 0011 0110 0100 0001 1111 1000 0101 0100 0100 1101 0111 1100 0000 0010 1111 0011 0101 1000 0000 1011 0000 0111 1100 0000 1111 1001 1000 1000 0111 1111 0000 1100 0110 1010 0010 0111 1111 1111 0101 1010 1011 0001 1101 0100 1010 0011 1110 0010 1001 1100 1010 1111 0001 1001 0111 1100 1111 1100 0010 1001 1001 1010 1110 0111 1111
2. 将264位二进制分成24组11位的二进制
第三步,我们需要用到 进制转换工具 和 2048助记词表 。
根据上面得到的24组11位二进制数,我们要在2048词表里找到对应的24个单词。
但是,二进制如何跟单词对应起来呢?
1. 我们将词表的2048个单词按a-z字母排序后标上 序号 ,从“0”到“2047”。
2. 最大的序号“2047”用二进制表示刚好是11位“11111111111”。
所以词表里的每一个词,我们都可以根据它的序号对应一个11位的二进制数。
对于转换二进制后不满11位的,我们在它的二进制数前面补“0”,不影响数值大小,同时还满足长度要求11位。
比如,【dice】是词表的第492个单词,序号则为“491”,它对应的二进制是9位:“111101011”,我们把它补齐11位:“00111101011”。
为减少工作量,我们直接将24组11位二进制用离线进制转换工具转换成十进制,然后按照十进制数找到对应序号的单词。
以第一组11位二进制“11000011011”举例,转化为十进制,表示为“1563”。由于我们定义的序号是从0到2047,所以,序号“1563”实际对应的是词表中第1564个单词【sell】。
按照上面的方法,我们可以得到24组11位二进制数对应的24个单词:
如果不自信是否操作正确,我们可以直接将助记词导入硬件钱包,看能否通过校验。如果无法通过,则需要从第二步开始重新操作。如果通过,则表示操作正确。
目前市面上有个别钱包是不支持校验助记词有效性的,我们可以用一套无效助记词(如,24个cat)先试下是否提示助记词有误后再进行导入。如果报错,说明支持助记词校验!
关于助记词有效性的更多内容,可以参考掌柜这篇文章
《导入助记词时,输入错误会发生什么?》
第四步,我们需要用到 纸笔 或者 金属助记板 , 物理备份 助记词。
将24位助记词抄在纸上,或选用金属助记板备份(如Cobo金钢匣),防水、防火、防腐蚀和抗压等性能会更好一些。
切勿以拍照或其他形式存储在有可能联网的设备中(离线手机、离线电脑、U盘等都属于有可能联网的设备),以防恶意软件盗取隐私。
对于更多存储方法和技巧,可以参考掌柜这篇关于
“深冷存储”
的文章
《偷不走的助记词》
冰川协议是使用62颗骰子掷出256位二进制,但是掌柜建议采用上述方法(1颗骰子)来减少复杂性。在掷骰子以及记录结果时,我们不需要担心出现人为错误。 只需要确保最终正确存储了有效助记词,其他错误就不会影响私钥的随机性和安全性。
Cobo金库硬件钱包后面将支持使用101颗骰子掷出的256位二进制转换为私钥。通过掷101颗骰子,我们可以获得与256位二进制数一样大的熵值(一颗骰子可掷出6种结果,101颗骰子的熵值 6的101次方 > 2的256次方 )。
最后,给大家留个 课后作业:
0100 1101 0001 1011 1000 1000 1111 0000 1110 1011 1101 1011 1000 1000 1000 0110 0100 1101 1100 1001 0100 0010 1101 0001 1111 1111 0001 0110 1001 1101 0111 0000 0001 1001 0000 1100 1011 0000 0000 1011 0101 1111 1010 1011 0111 0010 1110 0010 0001 1010 1111 1111 1111 0000 0111 0001 1110 1000 0010 0101 0011 0101 0110 1011
根据上面给出的256位二进制数,找到对应的24位助记词。
前23个单词是23张【Cobo金钢匣】..9..折..优..惠..码..,最后一个单词是一张..8..折..优..惠..码..!
由于有赞只支持6位及以上的优惠码,少于6个字母的单词,可以在前面补“0”,如【sell】对应的优惠码为【00sell】
Cobo金钢匣是一款 全钢 金属助记板,甚至连螺丝都是不锈钢材质的。备份24位助记词平均只需花费7分钟,字符块易找易取易操作~
参考链接:
[1] 网页链接
[2] 网页链接
[3] 网页链接
[4] 网页链接