diceware 的实现:我必须模拟掷骰子吗?

信息安全 密码 算法
2021-08-26 06:34:37

我正在创建一个基于 diceware 方法生成密码的小实用程序。目前我非常接近真实骰子的算法——即我模拟掷骰子n-times从列表中得到一个单词。

我想知道这是否真的有必要。0仅仅获得一个随机数和length(diceware_list) -1获得一个单词难道不够吗?

这种简化的方法会影响生成密码的安全性吗?(我正在使用加密安全的随机数源,所以这不是问题)。

我认为简化的方法应该没问题,但我不确定。请问有人可以帮忙吗?

4个回答

Diceware 提倡使用骰子选择密码的原因是它可以确保用户获得的密码是随机生成的。所以不,只要您确定您的程序以不可预测的方式选择密码(具有均匀分布的加密安全随机选择),密码实际上是如何生成的并不重要。

使用骰子还有其他无法在任何程序中复制的原因:

  1. 它对用户完全透明。他们不必信任计算机程序来使用适当的加密随机数生成器或不会将密码泄露给恶意行为者。
  2. 100% 防恶意软件。除非您在掷骰子时将网络摄像头对准您的桌子,否则您 PC 上的恶意程序实际上不可能观察或影响您生成的密码。

除非您的用户特别偏执,否则他们很有可能会放弃这些好处,转而使用即时生成新密码的额外便利。

是的,这样做非常好。使用良好的 PRNG,如果您正确执行限制(1 到 n),每个元素将具有完全相同的被选中几率。(我亲自完成了一个 diceware 实现,正是这样做的。)

在物理骰子过程中使用多个骰子有两个简单的原因:

  1. 6面骰子无处不在且便宜。
  2. 据我所知,7776 面骰子 (6^5) 不存在。如果大到足以阅读,滚动也会很尴尬,或者如果小到可以以传统方式滚动,则难以阅读。

请注意,我说的是“如果你正确地执行了限制(1 到 n)”。如果您的随机数生成库不提供 1 到 n 的原语,请不要简单地取一个更大的值并取模 n!虽然这将给出正确范围内的答案,但它们不会均匀分布。您应该:

  1. 继续重试,直到返回可接受范围内的值(即丢弃所有值>n)
  2. 线性缩放:(rand_val * n / rand_max这将需要任意精度数学以避免舍入误差)

Ajedi32 的回答很棒。我想强调一个可能有助于更好地回答您的问题的细节。安全密码生成的关键是确保您的密码是不可预测的不是“随机的”。随机的想法是后来出现的。目标是不可预测的。如果您考虑一下,现有的最安全密码不是随机密码,而是攻击者猜测的最后一个密码。这是他们无法预测的。

现在,在实践中,这里正在进行一场猫捉老鼠的游戏。如果您尝试想出最不可预测的密码,他们会尝试预测您如何生成密码。这就是为什么像 qazxswedc 这样的密码看起来是随机的,但是一旦他们弄清楚你在做什么来生成密码,他们就会很容易破解它。

这就是随机性最终出现的地方。对于现代密码学,我们努力使用的数字不仅对攻击者来说是不可预测的,而且对于任何人来说都是不可预测的,包括你自己!随机数是字面上无法以任何方式预测的数字。如果您在生成数字时正在观看,您只能知道选择了哪些数字。随机性意味着您可以对预测密码的难度做出数学陈述,因为即使是您自己也无法控制这一代。

几千年来,骰子一直是随机数的“标准”来源。还有很多其他的(例如易经占卜,传统上使用一束蓍草),但骰子已经存在了很长时间。如果施法得当(不要直升飞机!),它们是足够好的随机数来源,因为骰子的弹跳是高度混乱和不可预测的。你需要心灵感应来影响结果(想想星球大战:幽灵的威胁)。

如果您担心加载骰子,正如评论中的某些人所提到的,您实际上可以进行统计分析,以确定您实际可以依赖的每掷骰子的熵位。与赌场相比,密码生成对加载的骰子不太敏感(您总是可以进行额外的掷骰,增加可能性的数量。因为赌场发放现金,他们无法在每一轮中乘以,他们必须添加。这使他们更多敏感的)。

所以现在我们可以更接近您的问题,因为我们了解您要完成的工作。模拟骰子实际上并没有你想象的那么好,因为模拟每次都会做同样的事情,除非你在模拟中内置了随机性来源,这会破坏这一点。

问题是:你可以信任什么随机来源?这是您必须了解您的威胁模型的地方。你的攻击者能做什么?你的攻击者能读懂你的击键吗?如果是这样,你就有麻烦了,因为你必须输入密码。所以,实际上,我们可以假设攻击者对你的机器没有足够的控制权来读取击键。

你可以从那里继续工作。我的猜测是您的威胁模型假设您的计算机是原始的,在这种情况下,您可以依赖经过时间考验的熵源,例如/dev/random. 在这种情况下,最好的答案是从该来源中提取并直接使用它(不需要骰子模拟)。

如果你更关心安全性,你可以看看其他方面。一些算法在侧信道攻击方面存在问题,这些攻击让攻击者在某些特殊情况下可以窥探他们的状态,因此您可能会针对这些情况强化您的算法。您可能决定不信任计算机上的正常熵源(例如击键和网络活动之间的时间),因此您可能会投资随机性硬件源(通常围绕电阻网络中的噪声构建)。

但无论你走到哪里,请记住关键是不可预测,确保对手无法预测你的标准方法是随机到你无法预测自己。

随机数生成器被认为是“伪随机”,它不是真正随机的,因为它是通过数学计算的。骰子被认为是真正随机的,尽管我想你可以争辩说物理学没有什么不同......

通过以编程方式模拟骰子滚动,您正在消除骰子软件所需的真正随机性。因此,您在模拟骰子和选择随机词之间感到困惑,两者都是伪随机的。