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

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

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

它没有任何问题 – 它足以生成简单的密码。 一个简单的例子( 来源 ):

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 

文章如何:生成随机密码(C#/ VB.NET)有一个非常全面的例子,可以生成具有指定复杂性的良好,易于读取的密码。 这对你来说可能有点过分,但它可能提供一个很好的来源来复制想法。


如果您需要更多用于加密的内容,那么还有另一个命名空间:

 System.Security.Cryptography 

具体来说,你可以使用这个:

 System.Security.Cryptography.RNGCryptoServiceProvider.GetBytes(yourByte) 

一个例子是在VB.NET中使用Crypto作为随机数 ,另一个是加密随机数

如果您正在考虑自己推出,那么网站开发者指南共享会提供一些信息来与您讨论。

System.Random 不是随机性的“密码强”来源。 假设攻击者知道(或可以猜测)用于创建System.Random的“种子”值,则Random函数的输出完全可预测。 如果你只是调用新的System.Random(),那么初始值只是当前系统时间的表示(攻击者通常很容易猜到的东西)。

即使初始时间不确切,攻击者也可以通过powershell检查给定时间范围内的所有潜在值。

System.Security.Cryptography命名空间中的随机生成器设计用于此类情况,并从许多更安全的源中获得不可预测性。

如果您正在了解如何使System.Random为您工作的一些细节,那么CodeBetter文章非常值得一读。 他很好地概述了Random函数正在做什么,以及如何使用散列GUID作为种子使其“更随机”。 如果你只需要为用户帐户生成随机初始密码(我假设在这里),那么这应该是绰绰有余的,在这种情况下,加密工具可能会有点过分。

一切都有RFC ! – 安全性的随机性要求 (RFC 4086)。

您还可以在硬件上花费大量资金来创建随机种子。 我认为盖革计数器是专业解决方案的标准。 现在大多数扑克网站都使用它。