Обновление 2016/1/23
Если этот ответ окажется полезным, вас может заинтересовать простая (~ 500 SLOC) библиотека для генерации паролей, которую я опубликовал :
Install-Package MlkPwgen
Затем вы можете генерировать случайные строки, как в ответе ниже:
var str = PasswordGenerator.Generate(length: 10, allowed: Sets.Alphanumerics);
Одним из преимуществ библиотеки является то, что код лучше разбит на части, поэтому вы можете использовать безопасную случайность не только для генерации строк . Проверьте сайт проекта для более подробной информации.
Оригинальный ответ
Поскольку никто еще не предоставил безопасный код, я публикую следующую информацию на случай, если кто-нибудь найдет ее полезной.
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 = System.Security.Cryptography.RandomNumberGenerator.Create()) {
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();
}
}
Спасибо Ахмаду за то, что он указал, как заставить код работать на .NET Core.