14.7. A Better Random Number Generator
Problem
You need a random number with which to generate items such as a sequence of session keys. The random number must be as unpredictable as possible so that the likelihood of predicting the sequence of keys is as low as possible.
Solution
Use the classes
System.Security.Cryptography.RNGCryptoServiceProvider
and System.Random.
The RNGCryptoServiceProvider is used to populate a
random byte array using the GetBytes method that
is then printed out as a string in the following
example:
public static void BetterRandomString( )
{
// create a stronger hash code using RNGCryptoServiceProvider
byte[] random = new byte[64];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider( );
// populate with random bytes
rng.GetBytes(random);
// convert random bytes to string
string randomBase64 = Convert.ToBase64String(random);
// display
Console.WriteLine("Random string: {0}\r\n ",randomBase64);
}Discussion
Random provides methods like
Next, NextBytes, and
NextDouble to generate random information for
integers, arrays of bytes, and doubles, respectively. These methods
can produce a moderate level of unpredictability, but to truly
generate a more unpredictable random series, you would want to use
the RNGCryptoServiceProvider.
RNGCryptoServiceProvider can be customized to use
any of the underlying Win32 Crypto API providers by passing a
CspParameters structure in the constructor to determine exactly which provider is responsible for generating the random ...