针对此密码生成方案的可能攻击类型

本文关键字:攻击 类型 方案 密码 | 更新日期: 2023-09-27 17:51:03

下面的代码使用PRNG(伪随机数生成器)Random类来为初始临时密码生成密码字符,而不是应该使用的加密安全性更高的RNGCryptoServiceProvider

然而,它确实使用RNGCryptoServiceProvider为PRNG生成种子,所以我认为这可能值得一些,而不是基于当前时间播种,因为使用PRNG时使用安全性不是一个问题。

我的问题是:为了破坏密码生成系统并猜测新用户的密码,这种攻击方法有多容易或难?

// Generate 4 random bytes.
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
// Convert 4 bytes into a 32-bit integer value.
int seed = (randomBytes[0] & 0x7f) << 24 | randomBytes[1] << 16 | randomBytes[2] << 8 | randomBytes[3];
// Now, this is real randomization.
Random random = new Random(seed);

代码然后继续使用random.Next()生成字符来填充密码字符串。

免责声明:此代码不是我发明的。不要为此责怪我,也不要就如何解决这个问题提出建议。我知道怎么解决它,我知道它很糟糕。不要浪费时间这样回答。任何评论或回答都将被标记为垃圾邮件。我只在我们的代码中发现它,我对它的"安全"属性很好奇。

针对此密码生成方案的可能攻击类型

PRNG函数的问题是可预测性。能够根据之前的输出预测它的输出。避免使用Random类的原因是,通过监视它的输出,可以开始预测未来的输出。

上面的代码可能是问题,也可能不是问题。这归结为Random类实例化的频率。如果您正在使用来自加密强度PRNG的种子创建一个新实例,并从中仅生成一个密码,那么您应该没问题。我这样说是因为即使我从一个生成的密码中了解了PRNG的状态,它与将来生成的密码没有关系。

如果您使用这个例程来初始化Random的静态实例,那么您肯定有一个潜在的问题。假设有人使用这种方法向电子邮件发送临时重置密码。攻击者可以多次重置自己的密码,从而开始预测未来的密码。一旦他能预测到下一个密码,他只需为他想要入侵的账户启动其余的密码。他已经知道了通过电子邮件发送的密码,然后就可以访问该帐户了。