Einfacher Passwort-Generator unter Java

Das Ausdenken von Passwörtern ist prinzipiell eine schlechte Idee; besser ist es, wenn diese automatisch generiert werden. Ein solcher Generator kann problemlos selbst geschrieben werden. In diesem Fall in Java:

public class PasswordGenerator {

    private static final SecureRandom secureRandom = new SecureRandom();

    private static final String alpha = "abcdefghijklmnopqrstuvwxyz";
    private static final String alphaCaps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String numeric = "0123456789";
    private static final String specials = "!§$%&/()=?.:,;+*#<>";

    public enum CharacterSet {
        Alpha,
        AlphaCaps,
        AlphaBoth,
        Numeric,
        AlphaNumeric,
        Special,
        All
    }

    private static String getCharacters(CharacterSet characterSet) {

        switch (characterSet) {
            case Alpha:
                return alpha;
            case AlphaCaps:
                return alphaCaps;
            case AlphaBoth:
                return alpha + alphaCaps;
            case Numeric:
                return numeric;
            case AlphaNumeric:
                return alpha + alphaCaps + numeric;
            case Special:
                return specials;
            case All:
                return alpha + alphaCaps + numeric + specials;
        }

        return alpha;
    }

    public static String generatePassword(int length, CharacterSet characterSet) {

        String characters = getCharacters(characterSet);
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < length; i++) {
            stringBuilder.append(characters.charAt(secureRandom.nextInt(characters.length())));
        }

        return stringBuilder.toString();
    }
}

Der Generator funktioniert im Groben so, das aus einem bestimmten Zeichenvorrat zufällig Zeichen gewählt und aus diesen das Passwort erzeugt wird. Als Zufallsquelle kommt nicht die gebräuchliche Klasse Random zum Einsatz, sondern die Klasse SecureRandom. Diese von Random abgeleitete Klasse erzeugt aus kryptografischer Sicht starke Zufallszahlen, was die Sicherheit des Generators erhöht. Als kleines Gimmick lässt sich der gewünschte Zeichensatz, aus welchem das Passwort generiert werden soll, über einen Enum auswählen:

String s = PasswordGenerator.generatePassword(64, PasswordGenerator.CharacterSet.All);
System.out.println(s);

Damit würde auf der Konsole ein Passwort mit 64 Zeichen ausgegeben werden, welches den kompletten Zeichenvorrat der Generator-Klasse nutzt.

2 Kommentare » Schreibe einen Kommentar

  1. Hey,
    die Implementierung sieht sehr sauber aus. Da du schon mit einem Enum arbeitest, könntest du die Methode „getCharacters“ als abstrakte Methode ins Enum verschieben. Das wäre dann etwas objektorientierter und du wärst das switch-case los. Das sähe dann so aus:

    public enum CharacterSet {
    Alpha {
    @Override
    public String getCharacters() {
    return alpha;
    }
    },
    AlphaCaps {
    @Override
    public String getCharacters() {
    return alphaCaps;
    }
    },
    AlphaBoth {
    @Override
    public String getCharacters() {
    return alpha + alphaCaps;
    }
    },
    Numeric {
    @Override
    public String getCharacters() {
    return numeric;
    }
    },
    AlphaNumeric {
    @Override
    public String getCharacters() {
    return alpha + alphaCaps + numeric;
    }
    },
    Special {
    @Override
    public String getCharacters() {
    return specials;
    }
    },
    All {
    @Override
    public String getCharacters() {
    return alpha + alphaCaps + numeric + specials;
    }
    };

    private static final String alpha = „abcdefghijklmnopqrstuvwxyz“;
    private static final String alphaCaps = „ABCDEFGHIJKLMNOPQRSTUVWXYZ“;
    private static final String numeric = „0123456789“;
    private static final String specials = „!§$%&/()=?.:,;+*#“;

    public abstract String getCharacters();
    }

    Aufgerufen als CharacterSet.All.getCharacters()

  2. Die generatePasswort Funktion könntest du auch mit einem Java-Stream bauen:

    public static String generatePassword( int length, CharacterSet characterSet ) {
    return Stream.generate(() -> String.valueOf(characters.charAt(secureRandom.nextInt(characters.length()))))
    .limit(length)
    .collect(Collectors.joining());
    }

    Nur mal so als Anregungen ;)

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.