我目前正在编写一个简单的密码生成器(C#)。为此,我需要一些随机数字。
是否可以简单地使用.NET附带的Random类,或者是否存在任何已知问题?
答案 0 :(得分:13)
它没有任何问题 - 生成简单的密码就足够了。一个简单的例子(source):
Random RandomClass = new Random();
int RandomNumber = RandomClass.Next(); // Random number between 1 and 2147483647
double RandomNumber = RandomClass.Next(1,10); // Random number between 1 and 10
double RandomDouble = RandomClass.NextDouble(); // Random double between 0.0 and 1.0
文章 How To: Generate a Random Password (C#/VB.NET) 有一个非常全面的例子,可以生成具有指定复杂性的良好,易于阅读的密码。这对你来说可能有点过头了,但它可能会提供一个很好的来源来复制想法。
如果您需要更多用于加密的内容,那么还有另一个命名空间:
System.Security.Cryptography
具体来说,您可以使用:
System.Security.Cryptography.RNGCryptoServiceProvider.GetBytes(yourByte)
示例是 Using Crypto for your Random Numbers in VB.NET ,另一个是 Crypto Random Numbers 。
如果您正在考虑自己推广,网站 Developer Guidance Share 会提供一些信息来与您讨论。
答案 1 :(得分:10)
System.Random 不是“加密强”的随机源。假设攻击者知道(或可以猜测)用于创建System.Random的“种子”值,则Random函数的输出完全可预测。如果你只是调用新的System.Random(),那么初始值只是当前系统时间的表示(攻击者通常很容易猜到的东西)。
即使初始时间不确切,攻击者也可以通过强力检查给定时间范围内的所有潜在值。
System.Security.Cryptography命名空间中的随机生成器设计用于此类情况,并从许多更安全的源中获得不可预测性。
答案 2 :(得分:1)
如果您正在阅读有关如何让System.Random
为您工作的一些详细信息,那么这篇CodeBetter文章非常值得一读。他很好地概述了Random函数正在做什么以及如何使用散列GUID作为种子使其“更随机”。如果你只是需要为用户帐户生成随机初始密码(我在这里假设),那么这应该是绰绰有余的,在这种情况下加密工具可能会有点过分。
答案 3 :(得分:0)