Ako si vytvoriť generátor silného hesla

Od Peter Tokoš

Našim cieľom je vytvorenie kódu pre vygenerovanie silného hesla pomocou skriptovacieho jazyka PHP. Heslo bude obsahovať 12 znakov, pričom bude záležať na tom, aby obsahovalo aspoň jenno veľké písmeno, aspoň jedno číslo a aspoň jeden špeciálny znak. Kód pre náš príklad by mohol vyzerať takto:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>generator silného hesla</title>
  </head>
  <body>


    <h1>Generátor silného hesla</h1>
  	<p>Kliknite na tlačidlo nižšie pre generovanie nového hesla:</p>
  	<p><strong><?php echo generatePassword(); ?></strong></p>


<?php
// definovanie funkcie pre generovanie hesla
function generatePassword($length = 12) {
  // definovanie použiteľných znakov pre heslo
  $lower = 'abcdefghijklmnopqrstuvwxyz'; // malé písmená
  $upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // veľké písmená
  $numbers = '0123456789'; // čísla
  $special = '!@#$%^&*()_+{}[];.,/?'; // špeciálne znaky
  $all = $lower.$upper.$numbers.$special; // kombinácia všetkých použiteľných znakov

  // inicializácia premenných pre kontrolu znakov v hesle
  $hasLower = false;
  $hasUpper = false;
  $hasNumber = false;
  $hasSpecial = false;

  // vytváranie náhodného hesla s použitím definovaných znakov
  $password = '';
  for ($i = 0; $i < $length; $i++) {
    $index = rand(0, strlen($all) - 1); // náhodný výber indexu z kombinácie všetkých použiteľných znakov
    $char = substr($all, $index, 1); // výber znaku podľa náhodne zvoleného indexu
    $password .= $char; // pridanie znaku do hesla

    // kontrola, či heslo obsahuje požadované znaky
    if (strpos($lower, $char) !== false) { // ak heslo obsahuje malé písmeno
      $hasLower = true; // nastavenie premennej na true
    }
    if (strpos($upper, $char) !== false) { // ak heslo obsahuje veľké písmeno
      $hasUpper = true; // nastavenie premennej na true
    }
    if (strpos($numbers, $char) !== false) { // ak heslo obsahuje číslo
      $hasNumber = true; // nastavenie premennej na true
    }
    if (strpos($special, $char) !== false) { // ak heslo obsahuje špeciálny znak
      $hasSpecial = true; // nastavenie premennej na true
    }
  }

  // ak heslo neobsahuje požadované znaky, vygenerujeme ho znovu
  if (!$hasLower || !$hasUpper || !$hasNumber || !$hasSpecial) {
    return generatePassword($length); // rekurzívne volanie funkcie
  }

  return $password; // vrátenie vygenerovaného hesla
}
?>
  </body>
</html>