Wenn ein Benutzer auf unserer Website sein Passwort verliert und zur Seite "Passwort verloren" wechselt, müssen wir ihm ein neues temporäres Passwort geben. Es macht mir nichts aus, wie zufällig dies ist oder ob es allen "benötigten" starken Passwortregeln entspricht. Ich möchte ihnen nur ein Passwort geben, das sie später ändern können.
Die Anwendung ist eine in C # geschriebene Webanwendung. Also dachte ich daran, gemein zu sein und den einfachen Weg zu gehen, einen Teil eines Guid zu benutzen. dh
Guid.NewGuid().ToString("d").Substring(1,8)
Vorschläge? Gedanken?
Antworten:
Es gibt immer
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .quelle
ASP.NET Core
?Dies hat den guten Vorteil, dass Sie aus einer Liste verfügbarer Zeichen für das generierte Kennwort auswählen können (z. B. nur Ziffern, nur Groß- oder Kleinbuchstaben usw.).
quelle
Random
ist nicht kryptografisch sicher;System.Security.Cryptography.RNGCryptoServiceProvider
ist eine bessere Wahl.Die Hauptziele meines Codes sind:
Die erste Eigenschaft wird erreicht, indem ein 64-Bit-Wert modulo der Alphabetgröße verwendet wird. Bei kleinen Alphabeten (wie den 62 Zeichen aus der Frage) führt dies zu einer vernachlässigbaren Verzerrung. Die zweite und dritte Eigenschaft werden durch Verwendung von
RNGCryptoServiceProvider
anstelle von erreichtSystem.Random
.(Dies ist eine Kopie meiner Antwort auf Wie kann ich zufällige alphanumerische Zeichenfolgen mit 8 Zeichen in C # generieren? )
quelle
(Sie können auch die Klasse, in der diese Methode lebt, IDisposable implementieren lassen, einen Verweis auf die enthalten
RNGCryptoServiceProvider
und ordnungsgemäß entsorgen, um zu vermeiden, dass sie wiederholt instanziiert wird.)Es wurde angemerkt, dass die Ausgabelänge immer ein Vielfaches von 4 ist, da dies eine Basis-64-Zeichenfolge zurückgibt, wobei der zusätzliche Platz
=
als Füllzeichen verwendet wird. Derlength
Parameter gibt die Länge des Bytepuffers an, nicht die Ausgabezeichenfolge (und ist daher möglicherweise nicht der beste Name für diesen Parameter, jetzt denke ich darüber nach). Dies steuert, wie viele Bytes Entropie das Passwort haben wird. Da base-64 jedoch einen 4-stelligen Block verwendet, um alle 3 Bytes der Eingabe zu codieren, wird, wenn Sie nach einer Länge fragen, die kein Vielfaches von 3 ist, ein zusätzlicher "Leerzeichen" vorhanden sein, der=
zum Füllen des verwendet wird extra.Wenn Sie aus irgendeinem Grund keine Base-64-Zeichenfolgen verwenden möchten, können Sie den
Convert.ToBase64String()
Aufruf entweder durch eine Konvertierung in eine reguläre Zeichenfolge oder durch eine derEncoding
Methoden ersetzen . z.B.Encoding.UTF8.GetString(tokenBuffer)
- Stellen Sie einfach sicher, dass Sie einen Zeichensatz auswählen, der den gesamten Wertebereich des RNG darstellt und Zeichen erzeugt, die mit dem Ort kompatibel sind, an den Sie diesen senden oder speichern. Wenn Sie beispielsweise Unicode verwenden, werden in der Regel viele chinesische Schriftzeichen angezeigt. Die Verwendung von base-64 garantiert einen weitgehend kompatiblen Zeichensatz, und die Eigenschaften einer solchen Zeichenfolge sollten sie nicht weniger sicher machen, solange Sie einen anständigen Hashing-Algorithmus verwenden.quelle
Dies ist viel größer, aber ich denke, es sieht etwas umfassender aus: http://www.obviex.com/Samples/Password.aspx
quelle
Ich weiß, dass dies ein alter Thread ist, aber ich habe eine ziemlich einfache Lösung für jemanden. Einfach zu implementieren, leicht zu verstehen und leicht zu validieren.
Beachten Sie die folgende Anforderung:
Der folgende reguläre Ausdruck kann diesen Fall bestätigen:
Es liegt außerhalb des Rahmens dieser Frage - aber der reguläre Ausdruck basiert auf Lookahead / Lookbehind und Lookaround .
Der folgende Code erstellt einen zufälligen Zeichensatz, der dieser Anforderung entspricht:
Um die oben genannte Anforderung zu erfüllen, rufen Sie einfach Folgendes an:
Der Code beginnt mit einem ungültigen Zeichen (
"!"
), sodass die Zeichenfolge eine Länge hat, in die neue Zeichen eingefügt werden können.Anschließend wird eine Schleife von 1 bis zur Anzahl der erforderlichen Kleinbuchstaben ausgeführt. Bei jeder Iteration wird ein zufälliges Element aus der Kleinbuchstabenliste abgerufen und an einer zufälligen Stelle in der Zeichenfolge eingefügt.
Anschließend wird die Schleife für Großbuchstaben und für Zahlen wiederholt.
Auf diese Weise erhalten Sie Zeichenfolgen mit der Länge =,
lowercase + uppercase + numerics
in die Klein-, Groß- und Zahlenzeichen der gewünschten Anzahl in zufälliger Reihenfolge gesetzt wurden.quelle
System.Random
für sicherheitskritische Dinge wie Passwörter verwenden. Verwenden SieRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Dieser Code generiert niemals ein 'z'. random.Next erzeugt Ganzzahlen, die kleiner als die angegebene Zahl sind. Daher sollten Sie diese zusätzliche Zahl nicht von der Länge abziehen.Für diese Art von Passwort verwende ich normalerweise ein System, das wahrscheinlich leichter "verwendete" Passwörter generiert. Kurz, oft aus aussprechbaren Fragmenten und einigen Zahlen zusammengesetzt und ohne Mehrdeutigkeit zwischen den Zeichen (ist das eine 0 oder eine O? A 1 oder eine I?). Etwas wie
(Wird direkt in den Browser eingegeben, daher nur als Richtlinie verwendet. Fügen Sie außerdem weitere Wörter hinzu.)
quelle
Ich mag die Passwörter, die Membership.GeneratePassword () erstellt, nicht, da sie zu hässlich sind und zu viele Sonderzeichen haben.
Dieser Code generiert ein 10-stelliges, nicht zu hässliches Passwort.
Sicher, ich könnte einen Regex verwenden, um alle Ersetzungen durchzuführen, aber dies ist besser lesbar und wartbar IMO.
quelle
Ich habe diese Klasse erstellt , die RNGCryptoServiceProvider verwendet und flexibel ist. Beispiel:
quelle
Ich habe diese Methode ähnlich der im Mitgliedschaftsanbieter verfügbaren erstellt. Dies ist nützlich, wenn Sie die Webreferenz in einigen Anwendungen nicht hinzufügen möchten.
Es funktioniert großartig.
quelle
System.Random
für sicherheitskritische Dinge wie Passwörter verwenden. Verwenden SieRNGCryptoServiceProvider
Ich war immer sehr zufrieden mit dem in KeePass integrierten Passwortgenerator. Da KeePass ein .NET-Programm und Open Source ist, habe ich mich entschlossen, den Code ein wenig zu vertiefen. Am Ende habe ich nur KeePass.exe, die in der Standardanwendung installierte Kopie, als Referenz in meinem Projekt referenziert und den folgenden Code geschrieben. Sie können sehen, wie flexibel es dank KeePass ist. Sie können die Länge angeben, welche Zeichen eingeschlossen werden sollen / nicht usw.
quelle
quelle
Ich werde dem Topf eine weitere schlecht beratene Antwort hinzufügen.
Ich habe einen Anwendungsfall, in dem ich zufällige Passwörter für die Maschine-Maschine-Kommunikation benötige, sodass ich keine Anforderungen an die menschliche Lesbarkeit habe. Ich habe
Membership.GeneratePassword
in meinem Projekt auch keinen Zugriff darauf und möchte die Abhängigkeit nicht hinzufügen.Ich bin mir ziemlich sicher, dass
Membership.GeneratePassword
ich etwas Ähnliches mache, aber hier können Sie die Pools von Charakteren einstellen, aus denen Sie zeichnen können.Und einige Beispielausgaben:
Um Beschwerden über die Verwendung von vorzubeugen
Random
: Die Hauptquelle für Zufälligkeit ist immer noch das Krypto-RNG. Selbst wenn Sie die Sequenz, aus der sie hervorgehtRandom
(sagen wir, sie wurde nur produziert1
), deterministisch vorbestimmen könnten, würden Sie das nächste Zeichen, das ausgewählt werden würde, nicht kennen (obwohl dies den Bereich der Möglichkeiten einschränken würde ).Eine einfache Erweiterung wäre das Hinzufügen einer Gewichtung zu den verschiedenen Zeichensätzen. Dies könnte so einfach sein, wie den Maximalwert zu erhöhen und Durchfallfälle hinzuzufügen, um das Gewicht zu erhöhen.
Für einen humanistischeren Zufallspasswortgenerator habe ich einmal ein Aufforderungssystem unter Verwendung der EFF-Würfelwortliste implementiert .
quelle
Ich mag es, Passwörter zu generieren, genau wie Software-Schlüssel zu generieren. Sie sollten aus einer Reihe von Zeichen auswählen, die einer bewährten Methode folgen. Nehmen Sie die Antwort von @ Radu094 und ändern Sie sie, um den bewährten Methoden zu folgen. Fügen Sie nicht jeden einzelnen Buchstaben in das Zeichenfeld ein. Einige Briefe sind am Telefon schwerer zu sagen oder zu verstehen.
Sie sollten auch eine Prüfsumme für das generierte Kennwort in Betracht ziehen, um sicherzustellen, dass es von Ihnen generiert wurde. Ein guter Weg, dies zu erreichen, ist die Verwendung des LUHN-Algorithmus .
quelle
Hier ist was ich schnell zusammengestellt habe.
quelle
Ich benutze diesen Code, um ein Passwort mit einer Balance aus alphabetischen, numerischen und nicht_alpha_numerischen Zeichen zu generieren.
quelle
Das ist kurz und es funktioniert gut für mich.
quelle
Auf meiner Website verwende ich diese Methode:
Bearbeiten Sie die Zeichenfolge
_SymbolsAll
für Ihre Array-Liste.quelle
Der akzeptierten Antwort wurde ein zusätzlicher Code hinzugefügt. Es verbessert die Antworten nur mit Random und ermöglicht einige Passwortoptionen. Ich mochte auch einige der Optionen aus der KeePass-Antwort, wollte aber die ausführbare Datei nicht in meine Lösung aufnehmen.
Dies war der erste Link, als ich nach zufälligen Passwörtern gesucht habe. Das Folgende ist für die aktuelle Frage nicht relevant, könnte aber wichtig sein.
System.Web.Security.Membership.GeneratePassword
kryptografisch sicher ist und mindestens 20% der Zeichen nicht alphanumerisch sind.quelle
validChars kann ein beliebiges Konstrukt sein, aber ich habe mich entschieden, basierend auf ASCII-Codebereichen auszuwählen, um Steuerzeichen zu entfernen. In diesem Beispiel handelt es sich um eine 12-stellige Zeichenfolge.
quelle
quelle
Random
Mit diesem Paket können Sie ein zufälliges Passwort generieren und dabei fließend angeben, welche Zeichen es enthalten soll (falls erforderlich):
https://github.com/prjseal/PasswordGenerator/
Beispiel:
quelle
Wenn Sie die von System.Web.Security.Membership.GeneratePassword verwendete kryptografisch sichere Zufallszahlengenerierung verwenden möchten, aber den Zeichensatz auch auf alphanumerische Zeichen beschränken möchten, können Sie das Ergebnis mit einem regulären Ausdruck filtern:
quelle
quelle
Fügen Sie einen Timer ein: timer1, 2 Schaltflächen: button1, button2, 1 textBox: textBox1 und eine comboBox: comboBox1. Stellen Sie sicher, dass Sie Folgendes deklarieren:
Quellcode:
quelle
System.Random
zur Sicherheit verwenden.