摘要:亂數產生器:Random 與 RNGCryptoServiceProvider
Insecure Randomness (CWE 330) 所掃出的問題
大致的內容是說 原來我們用的
//int intLength = rd.Next(8, 12); 這個方法 是一個容易被破解的演算法
所以要改掉取亂數的方法
改成以下
using System.Security.Cryptography
private static RNGCryptoServiceProvider rngp = new RNGCryptoServiceProvider();
private static byte[] rb = new byte[4];
private static byte[] rb = new byte[4];
/// <summary>
/// 產生一個非負數且最小值在 min 以上最大值在 max 以下的亂數
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
public static int Next(int min, int max)
{
int value = Next(max - min) + min;
return value;
}
/// <summary>
/// 產生一個非負數且最大值 max 以下的亂數
/// </summary>
/// <param name="max">最大值</param>
public static int Next(int max)
{
rngp.GetBytes(rb);
int value = BitConverter.ToInt32(rb, 0);
value = value % (max + 1);
if (value < 0) value = -value;
return value;
}
/// 產生一個非負數且最小值在 min 以上最大值在 max 以下的亂數
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
public static int Next(int min, int max)
{
int value = Next(max - min) + min;
return value;
}
/// <summary>
/// 產生一個非負數且最大值 max 以下的亂數
/// </summary>
/// <param name="max">最大值</param>
public static int Next(int max)
{
rngp.GetBytes(rb);
int value = BitConverter.ToInt32(rb, 0);
value = value % (max + 1);
if (value < 0) value = -value;
return value;
}
用法如下
System.Text.StringBuilder sb = new System.Text.StringBuilder();
char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
int length = RNG.Next(8, 8);
for (int i = 0; i < length; i++)
{
sb.Append(chars[RNG.Next(chars.Length - 1)]);
}
string YourPassword = sb.ToString();
如此以來 產生的亂數結果就可以是 有上下限的亂數值了
產生的密碼:[CcXcOBNuUs]