使用随机数生成器类和 base 64 编码的组合来生成密码是否有任何缺点
本文关键字:密码 是否 缺点 任何 组合 随机数生成器 base 编码 | 更新日期: 2023-09-27 18:32:28
在我的Web服务中,我需要生成强密码,并且可以表示为字符串。目前,我使用 System.Security.Cryptography.RandomNumberGenerator
并生成一个足够大(让我们假设它真的足够大(的随机字节数组,然后使用 base 64 对其进行编码并将其返回给用户。
这样,我有一个随机密码,该密码是使用适合加密的PRNG(不是类Random
,请参阅此问题以了解为什么类Random
在这里不行的详细信息(,并且可以表示为字符串并在电子邮件中发送,显示在界面中或由用户键入或复制粘贴。
从安全的角度来看,这个方案有什么内在的问题吗?
关于从安全角度来看,这个方案是否存在任何固有的问题,我认为通过电子邮件发送密码本身就是一种安全风险。即使电子邮件在通过电线时被加密,它仍然会存储在您无法控制的介质上。
此外,您生成的密码类型不会被用户记住,使它们更有可能被写在便签或类似的东西上,供所有人查看。
和 RandomNumberGenerator 类基本上都是伪随机数生成器,并且由于它们基于算法,因此它们的输出随机程度是有限制的。
但是,与随机相比,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。