Erzeuge ein sicheres zufälliges Passwort in Java mit minimalen Anforderungen an besondere Zeichen

7

Wie erstelle ich ein zufälliges Passwort, das die Anforderungen an Länge und Zeichensatz des Systems in Java erfüllt?

Ich muss ein zufälliges Passwort erstellen, das 10-14 Zeichen lang ist und mindestens einen Großbuchstaben, einen Kleinbuchstaben und ein Sonderzeichen hat. Leider sind einige Sonderzeichen zu besonders und können nicht verwendet werden, so dass ich nicht nur gedrucktes ASCII verwenden kann.

Viele der Beispiele auf dieser Site generieren ein zufälliges Passwort oder einen Sitzungsschlüssel ohne genug Entropie in den Charakteren oder ohne realistische Anforderungen in einem Business-Setting wie die oben genannten, also frage ich mehr spitz Frage, um eine bessere Antwort zu bekommen .

Mein Zeichensatz, jedes Sonderzeichen auf einer Standard-US-Tastatur außer einem Leerzeichen:     

%Vor%     
summer 07.07.2015, 05:36
quelle

2 Antworten

8

Ich habe kürzlich von Passay erfahren. Es bietet die erforderliche Funktionalität, die in der PasswordGenerator-Klasse . Es erzeugt zufällig Kennwörter, die den Anforderungen ähnlich sind, die unten geschrieben werden, verwendend CharacterRules anstelle von PasswordCharacterSets, wie ich unten getan habe. Anstatt eine Liste der unbenutzten Indizes für die zufällige Zeicheneinfügung zu halten, mischt er einfach den Zeichenpuffer nach dem Einfügen von Zeichen, die die Anforderungen erfüllen.

Unten ist von vorher übrig geblieben, ich empfehle Passay, wenn Ihre Lizenzierung es erlaubt, sollte dieser Code anders funktionieren und liefert Details, warum die generierten Passwörter kryptographisch stark sind

Ich habe diesen Code zweimal geschrieben. Einmal um ein zufälliges Zeichenergebnis zu erhalten, aber es stellte sich heraus, dass die Verteilung der Zeichen von der Größe des Zeichensatzes abhing (hoppla!). Ich habe es neu geschrieben und jetzt sollten Sie einfach den Code kopieren / einfügen und das Main.java in die gewünschten Zeichensätze ändern. Obwohl es anders hätte gemacht werden können, denke ich, dass dies ein relativ unkomplizierter Ansatz ist, um das richtige Ergebnis zu erzielen, und ich ermutige zu Wiederverwendung, Kommentaren, Kritik und durchdachten Änderungen.

Die Steuerelemente des PasswordGenerator-Codes lauten wie folgt:

  • Min / Max Länge : Stellen Sie eine Zufallszahl ein
  • PasswordCharacterSet : Es wird angenommen, dass alle PasswordCharacterSets, die an PasswordGenerator übergeben wurden, aus eindeutigen Zeichensätzen bestehen. Andernfalls werden die zufälligen Zeichen in die Duplikate verschoben.
  • PasswordCharacterSet Min Characters : Die für diesen Zeichensatz zu verwendenden Min-Zeichen.

Die wichtigsten Bits für die eigentliche Passwortgenerierung:

  • Zufälligkeit von Random : Wir verwenden SecureRandom, das von einem kryptographisch starken PRNG unterstützt wird, und nicht von der Random-Klasse, die das nicht ist.
  • Zufällige Zeichenreihenfolge für das Passwort : Alle Indizes des pw char-Arrays werden zum restainIndexes-Array hinzugefügt. Wenn wir addRandomCharacters aufrufen, wird ein Index zufällig entfernt und wir verwenden den entfernten Index, um das Array zu füllen.
  • Zufällige Zeichen : In addRandomCharacters wird ein zufälliger Index aus dem von uns verwendeten Zeichenindex ausgewählt und zum pw-Array hinzugefügt.
  • Es wird sichergestellt, dass für jeden Typ minimale Zeichen gesetzt werden : Wir schnitzen einfach zuerst die minimale Zeichenmenge aus. Wir wählen die minimale Anzahl von zufälligen Werten aus jedem Zeichensatz und gehen dann weiter.
  • Zufällige Verteilung für die restlichen Zeichen : Nachdem die Mindestwerte festgelegt wurden, möchten wir den Rest der Zeichen über alle Zeichensätze hinweg zuführen. Alle Zeichen werden zu einem einzelnen Array hinzugefügt. Die verbleibenden Slots werden mit der gleichen Strategie für die vorherigen Zeichensätze gefüllt.

Beschreibung der Passwortkomplexität: Die Passwortkomplexität wird normalerweise in Bits der Entropie diskutiert. Hier sind die Möglichkeiten für Ihren Schlüsselraum:

Es gibt mindestens ein Großbuchstabe (von 26 Zeichen), ein Kleinbuchstabe (von 26), eine Ziffer (von 10) und ein Sonderzeichen (von 32) Anzahl der Möglichkeiten ist die Anzahl der Möglichkeiten für jedes Zeichen multipliziert mit der Anzahl der Zeichen, da sie zufällig in der Zeichenfolge angeordnet sind. Wir kennen also die Möglichkeiten für vier der Charaktere:

%Vor%

Alle verbleibenden Zeichen haben jeweils 94 (26 + 26 + 10 + 32) Möglichkeiten

Unsere Berechnung ist:

%Vor%

Wenn Sie also die sichersten Passwörter haben wollen, sollten Sie immer die höchstmögliche Anzahl von Zeichen wählen, die in diesem Fall 14 ist.

Haupt.java     

%Vor%

Passwortgenerator.java     

%Vor%     
summer 07.07.2015, 05:36
quelle
18

Ich empfehle Apache Commons RandomStringUtils. Verwenden Sie etwas, was bereits erledigt ist.

%Vor%

Wenn Sie maven verwenden

%Vor%

andernfalls laden Sie jar

herunter

UPDATE Version mit sicherem Zufall. Damit die benötigten Zeichen übrig bleiben und wie im Kommentar gelöst werden können, werden die benötigten Teile separat und normal erzeugt. Dann verbinden Sie sie zufällig.

%Vor%     
Robert Wadowski 07.07.2015 05:54
quelle

Tags und Links