Wie kann ich eine zufällige 8 Zeichen alphanumerische Zeichenfolge in C# generieren?
Antworten
Zu viele Anzeigen?Der von Eric J. geschriebene Code ist ziemlich schlampig (es ist ganz klar, dass er von vor 6 Jahren stammt... er würde diesen Code heute wahrscheinlich nicht mehr schreiben), und es gibt sogar einige Probleme.
Im Gegensatz zu einigen der vorgestellten Alternativen ist diese kryptografisch einwandfrei.
Unwahr... Es gibt eine Verzerrung im Passwort (wie in einem Kommentar geschrieben), bcdefgh
sind etwas wahrscheinlicher als die anderen (die a
ist nicht, weil durch die GetNonZeroBytes
keine Bytes mit einem Wert von Null erzeugt, so dass die Vorspannung für die a
ausgeglichen wird), so dass es kryptografisch nicht wirklich solide ist.
Damit sollten alle Probleme behoben sein.
public static string GetUniqueKey(int size = 6, string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
{
using (var crypto = new RNGCryptoServiceProvider())
{
var data = new byte[size];
// If chars.Length isn't a power of 2 then there is a bias if
// we simply use the modulus operator. The first characters of
// chars will be more probable than the last ones.
// buffer used if we encounter an unusable random byte. We will
// regenerate it in this buffer
byte[] smallBuffer = null;
// Maximum random number that can be used without introducing a
// bias
int maxRandom = byte.MaxValue - ((byte.MaxValue + 1) % chars.Length);
crypto.GetBytes(data);
var result = new char[size];
for (int i = 0; i < size; i++)
{
byte v = data[i];
while (v > maxRandom)
{
if (smallBuffer == null)
{
smallBuffer = new byte[1];
}
crypto.GetBytes(smallBuffer);
v = smallBuffer[0];
}
result[i] = chars[v % chars.Length];
}
return new string(result);
}
}
Wir verwenden auch benutzerdefinierte Zeichenfolge zufällig, aber wir implementiert ist als ein String-Helfer, so dass es einige Flexibilität bietet ...
public static string Random(this string chars, int length = 8)
{
var randomString = new StringBuilder();
var random = new Random();
for (int i = 0; i < length; i++)
randomString.Append(chars[random.Next(chars.Length)]);
return randomString.ToString();
}
Verwendung
var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Random();
ou
var random = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".Random(16);
Die einfachste und flexibelste Lösung mit kryptographischer Sicherheit (.NET Core 3.0+):
Wenn Sie .NET Core 3.0 oder höher verwenden, können Sie die neue statische GetInt32
Methode (die kryptographisch sicher ist) auf dem RandomNumberGenerator
Klasse einen Zufallsindex für einen bestimmten Zeichensatz erzeugen und das Ergebnis auf diese Weise ganz einfach auffüllen.
Dieser Ansatz ist weitaus einfacher als beispielsweise der Ansatz, der in diese Antwort und bietet außerdem völlige Flexibilität, da Sie jeden beliebigen Zeichensatz eingeben können.
public static string GenerateRandomString(int length, IEnumerable<char> charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
{
var charArray = charSet.Distinct().ToArray();
char[] result = new char[length];
for (int i = 0; i < length; i++)
result[i] = charArray[RandomNumberGenerator.GetInt32(charArray.Length)];
return new string(result);
}
Verwendung:
string randomAlphanumericString = GenerateRandomString(length: 10);
2 Stimmen
Welcher Rest
8 Stimmen
O s o s
2 Stimmen
Es wäre schön, wenn die Sprachlokalisierung in diese Frage einbezogen würde. Vor allem, wenn Ihre Benutzeroberfläche für Chinesisch oder Bulgarisch geeignet sein soll!
0 Stimmen
Siehe auch Wie erstellt man eine zufällige Folge von Zahlen und Buchstaben mit einer Länge von 5?
22 Stimmen
Ein Beitrag mit so vielen positiven Bewertungen und so vielen guten Antworten hat es nicht verdient, als geschlossen markiert zu werden. Ich stimme dafür, dass es wieder geöffnet wird.
0 Stimmen
Als Kryptograph sehe ich hauptsächlich absolut falsche Antworten mit vielen positiven Bewertungen, um ehrlich zu sein. Wenn Sie eine sichere Zufallszeichenkette haben wollen, dann beschäftigen Sie sich bitte selbst mit Zufälligkeit und unvoreingenommenen Verteilungen, denn die stehen nicht auf der ersten Seite der Antworten.
0 Stimmen
Übrigens, hier ist eine Sammlung von Erzeugung von Zufallszeichenfolgen in verschiedenen Programmiersprachen .
0 Stimmen
Wer hat etwas von Sicherheit gesagt? Der OP fragte nur, wie man eine Zeichenkette erzeugt.