Generator bezpiecznych haseł
- Przydatne narzędzia
- poziom: początkujący
- aktualizacja: 12 lipca 2026
Do generowania haseł nie wolno używać rand() ani mt_rand() — są przewidywalne. Ten generator korzysta z random_int(), 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.
PHP
74 linii
Pobierz .php
<?php
/**
* Generator bezpiecznych haseł — skryptyPHP.com
* Zapisz jako: generator-hasel.php
*/
/**
* Generuje losowe hasło.
*
* @param int $dlugosc długość hasła (min. 4)
* @param bool $male użyj małych liter
* @param bool $duze użyj wielkich liter
* @param bool $cyfry użyj cyfr
* @param bool $specjalne użyj znaków specjalnych
* @param bool $bezMylacych pomiń znaki łatwe do pomylenia: l, I, 1, O, 0
*/
function generuj_haslo(
int $dlugosc = 16,
bool $male = true,
bool $duze = true,
bool $cyfry = true,
bool $specjalne = true,
bool $bezMylacych = false
): string {
$zestawy = [];
if ($male) { $zestawy[] = 'abcdefghijkmnopqrstuvwxyz' . ($bezMylacych ? '' : 'l'); }
if ($duze) { $zestawy[] = 'ABCDEFGHJKLMNPQRSTUVWXYZ' . ($bezMylacych ? '' : 'IO'); }
if ($cyfry) { $zestawy[] = '23456789' . ($bezMylacych ? '' : '10'); }
if ($specjalne) { $zestawy[] = '!@#$%^&*()-_=+[]{};:,.?'; }
if (!$zestawy) {
throw new InvalidArgumentException('Wybierz co najmniej jeden zestaw znaków.');
}
$dlugosc = max($dlugosc, count($zestawy), 4);
$znaki = [];
// Gwarancja: co najmniej jeden znak z każdego zestawu
foreach ($zestawy as $zestaw) {
$znaki[] = $zestaw[random_int(0, strlen($zestaw) - 1)];
}
// Reszta hasła — ze wszystkich wybranych znaków
$wszystkie = implode('', $zestawy);
for ($i = count($znaki); $i < $dlugosc; $i++) {
$znaki[] = $wszystkie[random_int(0, strlen($wszystkie) - 1)];
}
// Tasowanie Fishera-Yatesa na random_int() — shuffle() nie jest
// kryptograficznie bezpieczne, a znaki-gwarancje nie mogą
// zawsze stać na początku
for ($i = count($znaki) - 1; $i > 0; $i--) {
$j = random_int(0, $i);
[$znaki[$i], $znaki[$j]] = [$znaki[$j], $znaki[$i]];
}
return implode('', $znaki);
}
// ── PRZYKŁADY ───────────────────────────────────────────────
echo generuj_haslo(); // np. v7#Kp2!mQx9@RtWz
echo "\n";
echo generuj_haslo(24); // dłuższe = mocniejsze
echo "\n";
echo generuj_haslo(12, true, true, true, false); // bez znaków specjalnych
echo "\n";
echo generuj_haslo(16, true, true, true, true, true); // bez mylących znaków
// ── PROSTY FORMULARZ WWW (odkomentuj, aby użyć w przeglądarce) ──
// $dlugosc = min(max((int) ($_GET['dlugosc'] ?? 16), 8), 64);
// $haslo = generuj_haslo($dlugosc);
// echo '<form>Długość: <input type="number" name="dlugosc" value="' . $dlugosc . '" min="8" max="64">'
// . ' <button>Generuj</button></form>'
// . '<p>Twoje hasło: <code>' . htmlspecialchars($haslo) . '</code></p>';
Jak użyć tego skryptu
- Skopiuj funkcję
generuj_haslo()do swojego projektu i wywołuj z wybranymi parametrami. - Domyślne wywołanie
generuj_haslo()daje 16-znakowe hasło ze wszystkich zestawów znaków. - Do wersji z formularzem odkomentuj blok na końcu pliku i otwórz skrypt w przeglądarce.
Warto wiedzieć
random_int()czerpie z systemowego generatora kryptograficznego — w przeciwieństwie dorand()/mt_rand(), których wyniki da się przewidzieć.- Opcja
$bezMylacychprzydaje się przy hasłach dyktowanych przez telefon lub drukowanych — usuwa pary typu l/1 i O/0. - Wygenerowane hasło do konta użytkownika i tak zawsze zapisuj w bazie przez
password_hash()— nigdy jawnie. - Tasowanie Fishera-Yatesa gwarantuje, że „obowiązkowe" znaki z każdego zestawu trafią w losowe miejsca hasła.
#hasła
#random_int
#generator
#bezpieczeństwo
#losowość
Podobne skrypty
Przydatne narzędzia
Licznik odwiedzin bez bazy danych
Klasyczny licznik odwiedzin zapisywany do pliku tekstowego — z blokadą flock() zapobiegającą gubieniu wejść i ciasteczkiem odsiewającym wielokrotne odświeżenia.
początkujący Zobacz kod → Przydatne narzędziaPrzyjazne adresy URL — generowanie slugów
Zamiana dowolnego tytułu na przyjazny adres URL: „Żółta łódź podwodna!" → „zolta-lodz-podwodna". Z pełną mapą polskich znaków i funkcją zapewniania unikalności.
początkujący Zobacz kod → Przydatne narzędziaData i czas po polsku („12 lipca 2026", „5 minut temu")
Wyświetlanie dat w poprawnej polszczyźnie: odmienione nazwy miesięcy i dni tygodnia oraz funkcja „ile czasu temu" z prawidłową odmianą minut, godzin i dni.
początkujący Zobacz kod →