用骰子选词的密码短语:Diceware 为什么又好记又安全
Diceware 用真随机抽词组成密码短语,既背得下来又有足够的熵。本文讲清楚每词约 12.9 位熵、6 词约 77 位的算法,并给一个真实例子和实操建议。
用骰子选词的密码短语:Diceware 为什么又好记又安全
我自己换主密码那次,试过把一串 kR7!mQ9@zX9$ 这样的随机字符背下来。背了三天,在别人电脑上敲的时候还是卡壳,大写小写符号顺序全乱。后来改用 Diceware,选了六个词,念了几遍,到现在一年多没忘过。这篇就讲清楚这套方法为什么成立:它怎么用骰子选词,熵是怎么算的,以及为什么比随机字符密码好记得多。
Diceware 到底是什么
Diceware 是 Arnold Reinhold 在 1995 年提出的方法。原版玩法很朴素:拿五颗骰子一掷,得到一个五位数(比如 31425),去一张固定词表里查这个编号对应的词。重复几次,把抽到的词拼起来,就是你的密码短语。
骰子的作用是提供真随机。人脑选词永远会落进套路,生日、键盘相邻键、把 a 换成 @ 的 l33t 替换,这些攻击者全都默认会试,所以人选的密码真实强度远低于看上去的位数。骰子不带任何偏好,每个词被抽中的概率严格相等,这才是熵能算得准的前提。今天用浏览器的密码学安全随机源(crypto.getRandomValues)代替手掷骰子,效果一样,还更快。
词数和熵:一道乘法题
熵衡量的是"攻击者要猜多少次"。它的单位是 bit,每多一个 bit,猜测空间翻一倍。Diceware 的熵算起来是一道干净的乘法:
熵 = 词数 × log2(词表大小)
经典的完整 EFF 词表有 7776 个词,每个词贡献 log2(7776) ≈ 12.9 位熵。所以五颗骰子选六个词,大约 6 × 12.9 ≈ 77 位熵。这个数字是什么概念?在每秒一千亿次(10^11)的离线暴力尝试下,平均搜索一半密钥空间,77 位要算上几百年。
Toolora 的 Diceware 口令短语生成器用的是一张 1296 词(= 6^4)的精选英文词表,每词约 log2(1296) ≈ 10.34 位,六个词约 62 位,落在"强"这一档。词表更小读数会如实偏低,想补足只要多加一两个词,熵就线性往上走。工具会实时把这个 bits 数字、强度评级、离线破解时间一起显示出来,词数滑块拖一下,数字跟着跳,那套数学没法被糊弄过去。
一个真实例子
我抽出来的一组六词口令长这样:
cedar-violet-mantle-quartz-ember-trout
它携带约 62 位熵,评级"强"。重点是它读起来是六个普通英文词:雪松、紫罗兰、斗篷、石英、余烬、鳟鱼。今晚念三遍,明天就能在手机、被锁住的笔记本、别人机器上一字不差地敲出来。换成同样 62 位的随机字符串,大概是 kR7!mQ9@zX 这种十位全 ASCII,强度一模一样,但要背、要电话口述、要在电视遥控器上不出错地输,难度完全不是一个量级。
为什么好记又安全可以兼得
很多人以为强度和好记是矛盾的,得二选一。Diceware 的巧妙在于它把"复杂度"从单个字符身上挪到了词的数量上。
人脑记词是有结构的,六个具体名词能在脑子里串成一幅画面,而十个孤立字符没有任何抓手。但对攻击者来说,词表里每个词都是均匀随机抽的,他没法靠"这词更常见"来缩小范围,只能硬猜整个空间。于是记忆负担降下来了,熵却没掉。
还有个常被忽略的好处:这种口令念出来不丢精度。应急场景下要电话口述一个根凭证,"拼七个词典单词"比"拼 H、大写 K、美元符号、九……"在延迟和压力下靠谱太多。
几个别踩的坑
第一,把首字母大写或加个 1! 后缀,不会实质提升熵。攻击者默认会试这些固定变换,所以这类工具刻意不把大小写计入 bits。真要更强,就加词,别加花样。
第二,口令再强也不能跨站复用。六词口令对暴力破解很硬,但你要是把它敲进钓鱼页,或者某个被攻破的站点把它明文存了,长度救不了你。生成完顺手用密码强度检测器核一下读数,再给每个高价值账号现生成一个新的。
第三,别手动"优化"输出。打乱词序、把字母换成符号求心安,这些手改会聚集到可预测的模式上,反而可能降低有效熵。相信随机抽取的结果就好。
记住一句话:强度来自词数,不来自符号。需要更高的熵,就把词数从六加到七、加到八,每加一个英文词恰好多 10.34 位,清清楚楚。
Made by Toolora · Updated 2026-06-13