Przejdź do treści

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

  1. Skopiuj funkcję generuj_haslo() do swojego projektu i wywołuj z wybranymi parametrami.
  2. Domyślne wywołanie generuj_haslo() daje 16-znakowe hasło ze wszystkich zestawów znaków.
  3. 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 do rand()/mt_rand(), których wyniki da się przewidzieć.
  • Opcja $bezMylacych przydaje 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