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.
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
- Skopiuj kod i zapisz go w pliku o nazwie
GeneratorHasel.java— w Javie nazwa pliku musi być taka sama jak nazwa klasy publicznej. - 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". - Aby użyć generatora we własnym projekcie, skopiuj metodę
generujHaslo(...)do swojej klasy albo dodaj cały plik do projektu i wywołujGeneratorHasel.generujHaslo(). - 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. KlasaRandomi metodaMath.random()są przewidywalne — na podstawie kilku wyników da się odtworzyć kolejne. - Zwykły
Collections.shuffle(lista)używa wewnętrznie klasyRandom— dlatego w kodzie przekazujemy własnySecureRandomjako 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.
Podobne skrypty
Hashowanie i weryfikacja haseł przez PBKDF2
Hasło w bazie ma być nieczytelne nawet dla Ciebie. PBKDF2WithHmacSHA256 z losową solą, kosztem iteracyjnym, przenośnym formatem rekordu i porównaniem odpornym na analizę czasu — bez zewnętrznych bibliotek, na czystym JDK 17.
zaawansowany Zobacz kod → Przydatne narzędziaSzyfrowanie i odszyfrowanie przez AES-GCM
Uwierzytelnione szyfrowanie tekstu algorytmem AES-GCM: klucz 256-bitowy, losowy 96-bitowy IV, dane powiązane AAD i przenośny zapis Base64. Ktoś przestawi jeden bit szyfrogramu — odszyfrowanie się nie uda, zamiast po cichu zwrócić przekłamaną treść.
zaawansowany Zobacz kod → Przydatne narzędziaOdczyt argumentów wiersza poleceń
Parser tablicy args: opcje --nazwa=wartosc i --nazwa wartosc, łączone flagi -vf, separator --, argumenty pozycyjne, wartości domyślne oraz czytelny błąd, gdy brakuje opcji obowiązkowej.
średni Zobacz kod →