0

在我的网络服务中,我需要生成强密码并且可以表示为字符串。目前我使用System.Security.Cryptography.RandomNumberGenerator并生成一个足够大(假设它真的足够大)的随机字节数组,然后使用 base 64 对其进行编码并将其返回给用户。

这样我就有了一个随机密码,它是使用适合加密的 PRNG 生成的(不是 class Random,请参阅这个问题以了解为什么 classRandom在这里不可以的详细信息)并且可以表示为字符串并在电子邮件中发送,如图所示在界面中或由用户键入或复制粘贴。

从安全的角度来看,这个方案有什么本质上的错误吗?

4

2 回答 2

3

从安全的角度来看,这个方案是否存在固有的错误,我认为通过电子邮件发送密码本身就是一种安全风险。即使电子邮件在传输过程中被加密,它仍然会存储在您无法控制的介质上。

此外,您生成的密码类型不会被用户记住,这使得它们更有可能被写在便利贴或类似的东西上,供所有人查看。

于 2012-04-28T15:16:25.433 回答
2

Random和RandomNumberGenerator类基本上都是伪随机数生成器,并且由于它们基于算法,​​因此它们的输出的随机性是有限制的

但是与Random相比,RandomNumberGenerator类被认为是加密安全的伪随机数生成器,因为它使用了许多其他环境参数(http://en.wikipedia.org/wiki/CryptGenRandom)来确保随机性。一些参数是:

  • 当前进程ID
  • 当前线程ID
  • 自引导时间以来的滴答计数
  • 当前时间
  • 各种高精度性能计数器
  • 用户环境块的 MD4 哈希
  • 高精度内部 CPU 计数器

请浏览以下关于随机性的有趣阅读链接:http: //www.codinghorror.com/blog/2006/11/computers-are-lousy-random-number-generators.html


对于正常使用场景,例如在您的情况下生成密码,使用RandomNumberGenerator类就足够了(http://msdn.microsoft.com/en-us/library/system.random.aspx):

“例如,要生成适合创建随机密码的加密安全随机数,请使用派生自 System.Security.Cryptography.RandomNumberGenerator 的类,例如 System.Security.Cryptography.RNGCryptoServiceProvider。”

于 2012-04-28T17:24:21.863 回答