Cryptographically Secure Random Data C# with Example
There are times when the framework's Random() class may not be considered random enough, given that it is based on a psuedo-random number generator. The framework's Crypto classes do, however, provide something more robust in the form of RNGCryptoServiceProvider. The following code samples demonstrate how to generate Cryptographically Secure byte arrays, strings and numbers. Random Byte Array public static byte[] GenerateRandomData(int length) { var rnd = new byte[length]; using (var rng = new RNGCryptoServiceProvider()) rng.GetBytes(rnd); return rnd; } Random Integer (with even distribution) public static int GenerateRandomInt(int minVal=0, int maxVal=100) { var rnd = new byte[4]; using (var rng = new RNGCryptoServiceProvider()) rng.GetBytes(rnd); var i = Math.Abs(BitConverter.ToInt32(rnd, 0)); return Convert.ToInt32(i % (maxVal - minVal + 1) + minVal); } Random String public static string GenerateRandomString(int length, string allowableChars=null) { if (string.IsNullOrEmpty(allowableChars)) allowableChars = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Generate random data var rnd = new byte[length]; using (var rng = new RNGCryptoServiceProvider()) rng.GetBytes(rnd); // Generate the output string var allowable = allowableChars.ToCharArray(); var l = allowable.Length; var chars = new char[length]; for (var i = 0; i < length; i++) chars[i] = allowable[rnd[i] % l]; return new string(chars); }