密语与密码生成器¶
会用到的两种情况:
- 刚申请密码管理器,要设一组主密码:那组密码是所有其他密码的门,随手打几个字应付过去很常见,但没人知道那样够不够强。用密语模式抽六个字,画面上会直接显示熵有多少。
- 怀疑手边的电脑被人动过:切到「实体骰子」模式,随机性来自你自己的手,不需要相信这台机器。
密语与随机密码怎么抽出来¶
「密语」模式从 asian-diceware 的 7776 字词表里独立抽几个字串起来。那份词表是社群参考 EFF Diceware 做的版本,混进了 oolong、boba、tofu 这类已经进英文字典的亚洲外来语,对在台湾与亚洲各地生活的人更好认、更好记。
「随机密码」模式从你勾选的字符集里逐字抽。适合用密码管理器保管、不需要用手打的场合。
两个模式的随机数都来自 crypto.getRandomValues,那是浏览器提供的密码学等级随机数,比网页常用的 Math.random 更难被推算出下一个值。取样时如果直接拿随机数对 7776 取余数,词表最后几个字会比其他字容易被抽到,所以不能整除的尾巴会丢掉重抽,让每个字被抽中的概率完全相同。细节与测试见源代码。
熵那个数字¶
熵是「要猜多少次才猜得到」的度量,单位是比特。每多一个比特,猜的次数就要多一倍。
七千七百多个字里抽六次,熵大约是 77.5 比特。那代表即使攻击者知道你用的是这份词表、知道你抽了六个字,仍然要在 2^77.5 种组合里找。EFF 建议一般用途至少六个字,主密码或加密磁盘这类长期不换的地方可以用七到八个。
字数少于五个的密语不要拿来保护重要的东西。工具会把它标成偏弱。
为什么密码生成器可以放在网页上¶
密码生成器最大的疑虑是「这个网站会不会偷偷把生成的密码送出去」。
这一页的答案是:把网络关掉,它照样能用。断网的情况下浏览器送不出任何东西,而工具仍然抽得出密语,因为词表与程序都已经存在你的设备上(见离线阅读)。断网之后照样抽得出密语,就是最直接的证明。
不想连这个都要相信的话,切到「实体骰子」模式。
用实体骰子,不用信任这台电脑¶
Diceware 原本就是掷骰子的方法。词表的顺序本身就是编码:第一个字是 11111,最后一个是 66666,中间按六进位排。
掷五颗骰子,照掷出的顺序按下画面上的数字,凑满五颗就查出一个字。重复到你要的字数。
这个模式下随机性来自你的手,不来自这台电脑。crypto.getRandomValues 可不可信、这一页的程序有没有被换掉,都不再是问题,因为它只剩查表的工作。
而查表的正确性你也可以自己验。按「下载完整对照表」会给你一份纯文字档,7776 行,每行是编码加对应的字。打印出来或存起来之后,这一页就不是必要的。
几件实际操作上的事:
- 骰子要够公正。便宜的塑料骰子有偏差,赌场等级的精密骰子才真的均匀。日常用途下一般骰子已经够好,但知道有这个差别比不知道好。
- 不要用手机上的掷骰 App。那绕了一圈回到「要相信软件」。
- 五颗骰子一起掷比一颗掷五次快,但要记得分辨顺序,可以用不同颜色的骰子。
- 熵跟程序抽取完全相同:词表有 7776 个字,每掷一轮相当于从里面抽一次,换算下来约 12.9 比特。
词表的来源与选字标准见 asian-diceware。
复制之后记得清剪贴板¶
按「复制」会把结果放进系统剪贴板,那里的内容其他程序读得到,有些输入法与同步服务还会把它上传。贴进密码管理器之后,复制一段无关的文字盖掉它。
手机上更要注意,剪贴板常常跨 App 共用。
接下来¶
- 生成好的密语要有地方放,见密码管理器入门
- 词表怎么做出来的、选字有什么原则,见 Asian Diceware
离线可用¶
跟这一区其他工具一样,程序存进设备之后没有网络也能用。词表也会一起存下来,断网时照样抽得出密语。
要把这一页带着走,见离线阅读。