亂數產生器:Random 與 RNGCryptoServiceProvider

  • 3674
  • 0

摘要:亂數產生器: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];
 /// <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;
    }

用法如下

 

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]