如您所知,有许多密码生成器可以提高计算机安全性。
假设给了我这样一个密码(比如,一串字母、数字、符号等),有没有办法测试它的随机性?这种测量是否有某种指数?
谢谢!
如您所知,有许多密码生成器可以提高计算机安全性。
假设给了我这样一个密码(比如,一串字母、数字、符号等),有没有办法测试它的随机性?这种测量是否有某种指数?
谢谢!
出于安全目的考虑随机生成器和随机数生成器时,您必须非常小心。要回答您的问题,您可以对 RNG 进行许多测试,例如,请参阅此处提供的链接:http: //csrc.nist.gov/groups/ST/toolkit/rng/batteries_stats_test.html
请注意,我假设您实际上是在询问“如何测试密码生成器的随机数生成器”,而不是“如何测量给定随机位数组的随机性(或熵)”的问题 - 它有上面已经回答了。
请注意,生成的随机数可以很容易地用于生成密码:生成几个字节的数据并使用您选择的一些转换将这些数据转换为密码。
我想提请您注意加密安全RNG 的概念。虽然 Mersenne Twister 通常被认为是您可以使用的更好的 RNG 之一,因为它效率很高并且在重复之前有很长的时间等等……但它不被认为是加密安全的。
加密安全的 RNG 算法对于安全敏感的应用程序(例如密码生成器)很重要。如果没有此属性,攻击者可以推断出您的 RNG 的当前状态并能够预测您的下一个密码。
现在,RNG 算法都是伪随机的(除非您使用真正的随机源,例如http://www.random.org或量子随机数生成器卡)。给定关于算法当前状态的知识,我们可以完美地预测下一个“随机”数。因此,推断此状态的攻击者将能够预测您的下一个“随机”密码。
除了对一个好的伪随机数生成器进行无数测试外,还要确保检查它实际上是加密安全的。否则,请使用真正的随机数生成器源。
信息论熵通常被视为随机变量“随机”程度的“度量”。这不会告诉您特定密码的随机性,但会告诉您创建密码的方法有多随机。一般来说,均匀分布的熵最高。在密码构造函数的上下文中(对于固定的密码长度),这对应于独立且统一地选取每个字符。请注意,允许的密码长度越长,它就越随机(因此具有更高的熵)。
另一种看待这个问题的方法是假设对构建密码的方法一无所知(即从黑客的角度来看)。然后,可以对可能的密码空间进行先验。一个聪明的先验可能会使包含英文单词的密码比随机字符串更有可能,因为人们倾向于使他们的密码对他们有意义,因为这样更容易记住。然后,“度量”或“随机性”将是根据您的先验分配给给定密码的概率。如果您可以访问生成器创建的多个密码,您可以使用这些数据来更新您之前的更准确的分发。
但是,如果您只看到一个密码,那么就没有多少信息可以继续了。除非可以收集更多关于生成器的数据,否则很难判断其“随机性”。
除了 Daniel 提出的使用信息度量的好建议之外,您还可以考虑将字符分组以克服必须处理太多组合的限制。自然分解为大写字母 (26)、小写字母 (26)、数字 (10) 和其他符号(5-15,具体取决于实现)。因此,您可以处理概率为 26/70、26/70、10/70 和 8/70 的组,而不是拥有 70 个独立符号。
或者,您可以考虑从一个字符到下一个字符的转换概率。密码“blah273blah”意味着转换概率“小写 -> 小写”为 6/10,“数字 -> 数字”为 2/10,“小写 -> 数字”为 1/10,以及“数字 ->小写”的 1/10。所有其他概率为零。这些应该与统一转换概率(如上所示)进行比较,尽管可以说是 Pearson这么多零单元格很难很好地工作。我想这是二进制事件运行测试的扩展。我确信存在多项式扩展并且适用于这种情况。
在任何情况下,您都需要有一个您最终会得到的任何“测试统计”的参考分布,这可以通过您自己可靠的随机密码源进行模拟来获得。为此目的使用真正的随机数可能会更好,例如,来自http://www.random.org。