.NET 3中System.Random的随机性如何?

时间:2009-01-04 22:52:53

标签: c# .net random

我目前正在编写一个简单的密码生成器(C#)。为此,我需要一些随机数字。

是否可以简单地使用.NET附带的Random类,或者是否存在任何已知问题?

4 个答案:

答案 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)