Last active
August 29, 2015 14:06
-
-
Save FaronBracy/3ec0eacc99ed5cf9fad2 to your computer and use it in GitHub Desktop.
Create a Crypto Random String
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
string RandomString(int length, string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") { | |
if (length < 0) throw new ArgumentOutOfRangeException("length", "length cannot be less than zero."); | |
if (string.IsNullOrEmpty(allowedChars)) throw new ArgumentException("allowedChars may not be empty."); | |
const int byteSize = 0x100; | |
var allowedCharSet = new HashSet<char>(allowedChars).ToArray(); | |
if (byteSize < allowedCharSet.Length) throw new ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize)); | |
// Guid.NewGuid and System.Random are not particularly random. By using a | |
// cryptographically-secure random number generator, the caller is always | |
// protected, regardless of use. | |
using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider()) { | |
var result = new StringBuilder(); | |
var buf = new byte[128]; | |
while (result.Length < length) { | |
rng.GetBytes(buf); | |
for (var i = 0; i < buf.Length && result.Length < length; ++i) { | |
// Divide the byte into allowedCharSet-sized groups. If the | |
// random value falls into the last group and the last group is | |
// too small to choose from the entire allowedCharSet, ignore | |
// the value in order to avoid biasing the result. | |
var outOfRangeStart = byteSize - (byteSize % allowedCharSet.Length); | |
if (outOfRangeStart <= buf[i]) continue; | |
result.Append(allowedCharSet[buf[i] % allowedCharSet.Length]); | |
} | |
} | |
return result.ToString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment