Przejdź do treści

Generator bezpiecznych haseł

  • Przydatne narzędzia
  • poziom: początkujący
  • aktualizacja: 15 sierpnia 2026

Do generowania haseł nie wolno używać klasy Random ani Math.random() — są przewidywalne. Ten generator korzysta z SecureRandom, czyli kryptograficznie bezpiecznego źródła losowości, i pilnuje, żeby w haśle znalazł się co najmniej jeden znak z każdego wybranego zestawu.

JAVA GeneratorHasel.java 77 linii Pobierz .java
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Generator bezpiecznych haseł — skryptyJAVA.pl
 * Zapisz jako: GeneratorHasel.java
 */
public class GeneratorHasel {

    private static final SecureRandom LOSOWE = new SecureRandom();

    /**
     * Generuje losowe hasło.
     *
     * @param dlugosc     długość hasła (min. 4)
     * @param male        użyj małych liter
     * @param duze        użyj wielkich liter
     * @param cyfry       użyj cyfr
     * @param specjalne   użyj znaków specjalnych
     * @param bezMylacych pomiń znaki łatwe do pomylenia: l, I, 1, O, 0
     */
    public static String generujHaslo(int dlugosc, boolean male, boolean duze,
                                      boolean cyfry, boolean specjalne, boolean bezMylacych) {
        List<String> zestawy = new ArrayList<>();
        if (male)      { zestawy.add("abcdefghijkmnopqrstuvwxyz" + (bezMylacych ? "" : "l")); }
        if (duze)      { zestawy.add("ABCDEFGHJKLMNPQRSTUVWXYZ"  + (bezMylacych ? "" : "IO")); }
        if (cyfry)     { zestawy.add("23456789"                  + (bezMylacych ? "" : "10")); }
        if (specjalne) { zestawy.add("!@#$%^&*()-_=+[]{};:,.?"); }

        if (zestawy.isEmpty()) {
            throw new IllegalArgumentException("Wybierz co najmniej jeden zestaw znaków.");
        }
        int minimalna = Math.max(zestawy.size(), 4);
        if (dlugosc < minimalna) {
            throw new IllegalArgumentException(
                    "Długość hasła musi wynosić co najmniej " + minimalna + ".");
        }

        List<Character> znaki = new ArrayList<>();

        // Gwarancja: co najmniej jeden znak z każdego zestawu
        for (String zestaw : zestawy) {
            znaki.add(zestaw.charAt(LOSOWE.nextInt(zestaw.length())));
        }

        // Reszta hasła — ze wszystkich wybranych znaków
        String wszystkie = String.join("", zestawy);
        for (int i = znaki.size(); i < dlugosc; i++) {
            znaki.add(wszystkie.charAt(LOSOWE.nextInt(wszystkie.length())));
        }

        // Tasowanie, żeby znaki-gwarancje nie stały zawsze na początku;
        // shuffle na SecureRandom pozostaje kryptograficznie bezpieczne
        Collections.shuffle(znaki, LOSOWE);

        StringBuilder haslo = new StringBuilder(znaki.size());
        for (char znak : znaki) {
            haslo.append(znak);
        }
        return haslo.toString();
    }

    /** Wygodna wersja z domyślnymi ustawieniami: 16 znaków, wszystkie zestawy. */
    public static String generujHaslo() {
        return generujHaslo(16, true, true, true, true, false);
    }

    // ── PRZYKŁADY ───────────────────────────────────────────
    public static void main(String[] args) {
        System.out.println(generujHaslo());                                   // np. v7#Kp2!mQx9@RtWz
        System.out.println(generujHaslo(24, true, true, true, true, false));  // dłuższe = mocniejsze
        System.out.println(generujHaslo(12, true, true, true, false, false)); // bez znaków specjalnych
        System.out.println(generujHaslo(16, true, true, true, true, true));   // bez mylących znaków
    }
}

Jak użyć tego skryptu

  1. Skopiuj kod i zapisz go w pliku o nazwie GeneratorHasel.java — w Javie nazwa pliku musi być taka sama jak nazwa klasy publicznej.
  2. Otwórz terminal w katalogu z plikiem i wpisz java GeneratorHasel.java — od Javy 11 pojedynczy plik uruchomisz bez osobnej kompilacji. Możesz też otworzyć plik w IntelliJ IDEA lub VS Code i kliknąć „Uruchom".
  3. Aby użyć generatora we własnym projekcie, skopiuj metodę generujHaslo(...) do swojej klasy albo dodaj cały plik do projektu i wywołuj GeneratorHasel.generujHaslo().
  4. Dostosuj hasło parametrami: długość oraz włączone zestawy znaków (małe i wielkie litery, cyfry, znaki specjalne, tryb „bez mylących znaków"). Metoda zwraca dokładnie żądaną liczbę znaków, a długość mniejszą niż 4 lub liczbę wybranych zestawów odrzuca wyjątkiem zamiast po cichu ją zwiększać.

Warto wiedzieć

  • Do haseł i tokenów zawsze używaj SecureRandom. Klasa Random i metoda Math.random() są przewidywalne — na podstawie kilku wyników da się odtworzyć kolejne.
  • Zwykły Collections.shuffle(lista) używa wewnętrznie klasy Random — dlatego w kodzie przekazujemy własny SecureRandom jako drugi argument.
  • Hasło o długości 16 znaków z wszystkich zestawów ma entropię ok. 100 bitów — to w zupełności wystarcza. Dla ważnych kont używaj co najmniej 16, a najlepiej 24 znaków.
  • Jeśli hasło ma trafić do bazy danych Twojej aplikacji, nigdy nie zapisuj go wprost — przechowuj wyłącznie skrót, np. z algorytmu PBKDF2 albo bcrypt.
#bezpieczeństwo #hasła #kryptografia #securerandom

Podobne skrypty