助记词生成本身是高风险环节
2013年8月的 Android SecureRandom 漏洞、2013年11月被指出的 BitAddress.org 熵收集问题、2023年4月披露的 Trust Wallet 浏览器扩展 32-bit 熵漏洞、2024年2月公开的 Trust Wallet iOS 时间戳熵漏洞。 2026年Coldcard的随机数问题更是灾难性的,他们长期强调其硬件TRNG、双Secure Element和多重随机源,谁曾想五年来他们一直绕开了这些硬件RNG。
很多人花了时间学Shamir Backup、学在钢板上打孔,却倒在了第一步生成助记词上。
掷骰子很快很简单
或许有其他著名钱包能够利用多重随机源来生成高随机性的助记词,但是coldcard事件后,把家庭资产放在任何钱包生成的助记词上都很难让我睡得安稳了。幸运的是掷骰子生成助记词很简单,你只是没有认真对待。 花一点时间研究掷骰子吧,未来随机源事件还会再次出现,但是你再也不用焦虑了。
我的掷骰子方案
你在其他地方可能看到过多种掷骰子方案,Coldcard使用普通六面骰子连续投掷,再对全部结果进行SHA-256,最后转换为助记词,此方法每掷一次可获得约2.6bit熵,虽然投掷次数较少但骰子与单词之间隔着一层无法心算的哈希。Blockstream Jade使用2个16面骰子+1个8面骰子,效率挺高,每次投掷可得到一个BIP39单词,但是多面骰子可能不如六面骰子常见,且骰子面数越多,制造和校准难度通常越高,轻微的几何或质量偏差可能更难察觉。
用11个最常见的六面骰子生成助记词的步骤:
- 双手一次掷11个骰子结果为:23563235212
- 转换为二进制:10010100101 (转换规则:骰子若为1、3、4则取0,若为2、4、6则取1)
- 转换为十进制:1189,则单词的序号为1189+1=1190(加1的原因是bip39里第一个单词的序号为0)
- 在bip39单词表里找到第1190个单词为:net text
- 生成最后一个单词:
- 若为12位助记词,则最后一次投掷只需七个骰子取7bit,如此总共投骰子得到128bit,经过SHA256后取前4bit追加到最后一次投掷的7bit后面,得到11bit就能重复步骤3到4获得最后一个单词。
- 若为24位助记词,则最后一次投掷只需三个骰子取3bit,如此总共投骰子得到256bit,经过SHA256后取前8bit追加到最后一次投掷的3bit后面,得到11bit就能重复步骤3到4获得最后一个单词。
<video autoplay loop muted playsinline preload=“metadata”
优势:
- 最小信任。每个骰子按奇偶各取1bit,11个骰子掷一次就得到一个单词,没有哈希,用户可自己查表验证。
- 不需要“赌场级”骰子。一旦你开始实操,用双手把11个骰子充分晃动你就知道即使手里是“玩具级”骰子都足以提供绝对高质量的熵。
- 投掷容易且快。 用11个硬币也可以,但是一旦你操作起来,你会发现11个六面骰子更容易摇散、更容易排序。