1

我正在做一些研究以决定一种生成一次性密码的方法。根据我到目前为止所遇到的材料,每个人都使用随机/伪随机密钥的一些散列和加密函数。为什么不能将基本随机函数用作一次性密码?如果密码生成只需要在服务器中发生并发送到客户端(通过文本),那么这种方法有什么缺点吗?

4

2 回答 2

4

非加密 PRNG 的设计目的不是为了安全。常见的弱点是:

  • 一颗太小的种子。例如,.net 使用 31 位整数,可以在几秒钟内枚举。攻击者观察一些输出并消除不符合期望的种子。一旦他们缩小到一个种子,他们就可以预测所有未来的输出。
  • 一颗可以预见的种子。例如时间。这要么直接导致可预测的输出,要么至少缩小要考虑的种子数量。例如,如果时间以毫秒为单位,并且攻击者知道 RNG 何时初始化为 20 毫秒,那么他们有 1/20 的机会猜测种子并预测输出。
  • 给定足够的输出,攻击者可以恢复 PRNG 的内部状态和/或预测未来的输出。像Mersenne Twister这样的算法就是这种情况。

=> 改用加密 PRNG。/dev/urandom在 Linux 和CryptGenRandomWindows 上。如果您的语言为这些内置了包装器,请使用它们。在 Java 中,这就是SecureRandom类。

于 2015-08-17T11:19:24.773 回答
1

我最近与安全专家就随机函数的使用进行了一次有趣的讨论。根据您使用的库,随机数并不是那么随机,理论上,可以让某人有可能预测随机数的结果并因此猜测密码。(例如VBA中的随机函数不是随机的。如果你不初始化函数,你总是得到相同序列中的相同随机数)

话虽如此,如果您没有使用“真正的”随机生成函数,则取决于密码的预期寿命(因为它是一次性密码,我认为这很短),可以进行某种“随机化”,使用例如鼠标在给定窗口上的移动,或者在调用随机函数生成密码之前使用机器的“定时器”,如果适用的话......

希望有帮助

于 2015-08-17T11:14:31.617 回答