文本和日常工具·密码生成器
模偏差解释:从列表中随机选择一个单词而不倾斜
· 工作原理
密码 随机性 密码学
显示当范围不均匀划分时,为什么“随机数模列表长度”比其他单词更青睐某些单词、偏差有多大,以及拒绝采样如何消除它。
公平的骰子和不公平的捷径 - 为什么以 7,776 为模的随机数与掷骰子不同
公平的来源仍然可以满足不公平的选择程序。如果程序读取一个整数并立即除以列表长度后取余数,则只要源范围不能精确整除该长度,某些索引就会收到更多源值。缺陷在于缩减步骤,而不一定在于字节。 ToolAcre 在选择任何 EFF 单词之前会避免使用该快捷方式。
仅当完整的结果组均匀映射时,物理骰子才能提供直观的比较。浏览器实现具有不同的原始范围,因此它计算所请求边界的接受窗口。本文讨论了该机制,而不是声称浏览器字节实际上再现了五个骰子。两者都可以选择指数,但其程序和审计证据是不同的。
偏差的来源 — 32 位值不会均匀地划分到 7,776 桶中,因此前几个单词获得一次额外的机会
对于一个字节和 100 界限,原始范围有 256 可能值。两组完整的 100 适合,留下 56 值。减少每个字节模 100 给出索引 0 到 55 每个三个原像,而索引 56 到 99 仅接收两个。输入字节可能是均匀的,但所选的桶分布却不是。
实现注释还导出了直接减少两个字节时 7,776 条目列表的相应有限范围问题。这些数字来自来源中指定的实际范围,而不是假设的攻击率。重要的审查问题是是否使用了剩余值,而不是少数生成的短语中的偏差是否看起来很小。
影响有多大——对于较大的随机范围来说很小,但非零,以及为什么密码代码拒绝接受它
确定性测试使不均匀的尾部可见。边界 3、5、7、100 和 7,776 故意显得尴尬,而 2 的幂边界则演示了无拒绝情况。另一种统计控制使用相同的 Web Crypto 源来实现正确的函数和一个简单的模帮助器,因此测试隔离了缩减策略,而不是归咎于熵源。
ToolAcre 不会将这些分布检查转换为破解时间预测。偏差会降低均匀性,但将这种降低转化为特定攻击者的成本需要完整的威胁模型。工程要求更清晰:每个符合条件的索引都应该具有相同数量的可接受的原始值,并且代码可以准确地强制执行这一点。
实现注释和确定性测试中经过验证的偏差示例
`secureRandomInt` 找到能够表示最高有效索引的最小整体字节数。它计算字节范围,减去除以边界后的余数,并将结果调用 `limit`。低于该限制的值属于完整组;在允许运行模运算之前,等于或高于该值的值将被丢弃。
每次拒绝后都会进行新的抽奖。该环路具有较高的固定天花板,因此损坏的注入源无法永远悬挂拉环;在重复超出范围的值后,它会抛出而不是返回有偏见的答案。此失败路径是正确性的一部分:拒绝可疑源可以保留返回索引来自统一接受窗口的承诺。
替代方案 — 绘制足够的位并丢弃超出范围的值,或使用库的统一整数函数
其他统一整数设计也是可能的,但它们不是此包的行为,因此不作为可互换的 ToolAcre 选项呈现。该引擎公开了一条经过审核的路径。 `secureRandomChoice` 验证其输入是非空数组并委托给 `secureRandomInt(items.length)`,使字选择成为有界整数合约的直接使用者。
随机密码生成器对字符使用相同的路径,然后调用由安全有界交换驱动的 Fisher-Yates 洗牌。它不将 `sort` 与随机比较器一起使用。将一个原语保留在多个功能之下可以使源代码审查变得容易:修复或测试统一减少一次,然后跟踪其调用者。
替代设计不在本模块范围内;发货路径使用拒绝采样
绑定-100 回归测试提供从 200 到 255 的每个尾部字节,然后是最后的 42。正确的代码会消耗所有 56 拒绝的字节和来自 42 的答案。第二个重点案例提供 200 和 7;因为 200 模 100 将为零,返回 7 证明第一个字节被拒绝而不是悄悄减少。
这个工作示例在设计上是确定性的,并且不包含任何凭据。生产字节对浏览器调用保持私有并且不会被记录。测试源只能注入,因此可以在边界强制行为;公共包不提供可以重现生成的密码的生产种子模式。
工作示例:绑定 100 拒绝字节 200 并接受以下 7
浮点随机归约、特定于库的统一 API 和不相关的改组算法不属于此实现范围。评估它们需要它们的来源和合同。 ToolAcre 的代码是基于整数且有明确限制的,因此添加对替代方案的调查会模糊测试实际证明的狭隘主张。
本文也没有推断统一生成的密码适用于每个策略或设备。统一索引选择解决了一种机制。即使每个列表元素都有相同的选择机会,存储、重用、剪贴板处理、恶意软件和目的地限制仍然是单独的问题。
要点 — 密码生成器必须统一选择单词;查看该工具的技术说明,了解密码生成器的工作原理
密码短语生成器不得仅仅因为其原始范围留下余数而偏向早期条目。 ToolAcre 从 Web Crypto 获取字节,拒绝不完整的尾部,并仅减少完整的同等大小组内的值。这些测试强制拒绝和接受边界,因此该声明不是基于对输出的目视检查。
在查看类似代码时,计算所选字节宽度的原始范围,将其除以请求的边界并查找丢弃的余数。如果没有尾部被拒绝,则要求提供另一份一致性证明。单词列表可以是公开的并且源是加密的,而粗心的减少仍然会引入可避免的偏差。