使用加密安全的PRNG生成密码更安全吗?

时间:2013-08-28 23:07:59

标签: random cryptography

我们有一个脚本可以在我的工作中建立一个新的Web服务器。该脚本涉及创建许多帐户以运行服务,应用程序池等。

我们需要为每个用户创建一个密码 - 即生成一个32个或者如此字符的ASCII字符串,用作登录密码。

我们对于是否应该使用加密安全的PRNG来完成这项工作,或者使用非加密安全的PRNG(带有时间依赖的种子)就足够了(我们在.NET中工作,我们之间存在分歧,所以具体的决定是在使用System.Random生成字符串和使用RNGCryptoServiceProvider之间 - 但是,这不是特定于语言的问题。)

是否必须使用加密安全随机性来生成密码,或者是一个明智的普通PRNG?

2 个答案:

答案 0 :(得分:3)

在许多情况下,攻击者可以从几个输出值轻松恢复(非加密)随机数生成器的状态 - 而不知道有关种子的任何信息。在那之后,预测所有未来和所有以前的随机数是微不足道的。

这需要多少输出取决于算法。在线性同余生成器的情况下,例如Java java.util.Random,可以从两个输出恢复状态。对于Mersenne Twister,在PHP和Python等中使用,您需要获得624个输出。我不熟悉.NET,但我认为这是一个类似的故事。

根本没有涉及复杂的数学。亲眼看看:

结论:使用加密安全随机数生成器来处理与安全性有关的任何事情。

答案 1 :(得分:2)

理论上,如果攻击者知道您生成随机密码的确切算法(比如,他掌握了您的代码),并且他知道您使用系统时间为您的PRNG播种,那么他可以重现每个瞬间生成的密码及时达到系统计时器的分辨率,减少他的暴力密码搜索数量级。

系统计时器的熵基本为零。如果您使用/ dev / random(在Linux / OSX上)或CryptGenRandom(Windows)上播放RNG,那么PRNG本身不是CS的事实可能无关紧要,因为攻击者必须获得多个密码的数据能够破解它。但是,如果您已经使用CSPRNG为PRNG播种,那么您最好只是使用它来创建密码。

非CS PRNG很快,非常适合游戏模拟和蒙特卡罗集成,但安全密码,随机数,密钥等应该真正使用安全算法。

尽管如此,安全性一如既往不是“是/否”问题 - 它始终是成本/收益的问题。正确的选择总是取决于你所保护的价值,你保护它的成本,你可能的攻击者,失败的代价等等,所以对于每种情况都没有单一的正确选择。

相关问题