Jak wygenerować bezpieczne, losowe hasło dla użytkownika.doc

(28 KB) Pobierz
[PHP] Jak wygenerować bezpieczne, losowe hasło dla użytkownika

[PHP] Jak wygenerować bezpieczne, losowe hasło dla użytkownika?

Problem

Chcesz wygenerować użytkownikowi losowe hasło, którego będzie używał do chwili, aż nie zmieni go na inne.

Rozwiązanie

Wszystkie poufne informacje, a także konta internetowe czy bazy danych wymagają autoryzacji i podania hasła. Zakładając hasło użytkownikowi po raz pierwszy warto je wygenerować losowo, co zapewni, że nikt nie będzie go w stanie łatwo odgadnąć. Po uruchomieniu konta wystarczy przesłać hasło do użytkownika i poprosić go, aby jak najszybciej zmienił je na własne, dowolne.

Wygenerujmy więc hasło losowe składające się z podanego zestawu znaków. Jego długość też będzie losowa, ale nie będzie krótsze lub dłuższe niż założona ilość znaków.

Przykład hasła losowego: Gjx5xY2

<?

$min=6;

$max=12;

 

srand((double)microtime()*1000000);

for($i=0;$i<rand($min,$max);$i++) {

  $znak=chr(rand(48,122));

  if (eregi("[0-9a-zA-Z]",$znak)) $haslo .= $znak;

  else $i--;

}

 

echo "Twoje hasło: <b>$haslo</b>";

?>

Na początku skryptu podajemy akceptowaną długość hasła losowego. W naszym przypadku może ono mieć od 6 do 12 znaków włącznie. Następnie inicjujemy generator liczb losowych, aby wartości były jak najbardziej przypadkowe i w pętli losujemy znaki z zakresu od 48 (cyfra "0") do 122 (litera "z").

Jeżeli znak znajduje się w podanym zakresie, a więc jest cyfrą lub literą, akceptujemy go i dodajemy do hasła. Jeżeli jest innym znakiem, zmniejszamy licznik pętli i losujemy ponownie hasło aż będzie odpowiadało znakom z podanego zakresu.

Wśród znaków o kodach ASCII od 48 do 122 są również nawiasy, małpa i wiele innych symboli, które nie zawsze można w hasłach zastosować. Dlatego funkcja eregi() sprawdza, czy znak jest w określonym przez nas zakresie.

Funkcja chr() zwraca znak o określonym numerze z tablicy ASCII, np. numer 122 to mała litera "z". W wyrażeniu regularnym [0-9a-zA-Z] można dodawać kolejne znaki, np. [0-9a-zA-Z%:=] zaakceptuje również procenty, dwukropki i znak równości.

Możesz też wygenerować wiele haseł za jednym razem, np. 10 i zapisać je do pliku:

<?

function haslo() {

  $min=6; $max=12;

  for($i=0;$i<rand($min,$max);$i++) {

    $znak=chr(rand(48,122));

    if (eregi("[0-9a-zA-Z]",$znak)) $haslo .= $znak;

    else $i--;

  }

  return $haslo;

}

 

srand((double)microtime()*1000000);

$f=fopen("hasla.txt","w");

for ($i=0;$i<10;$i++) {

  fputs($f, haslo()."\n");

}

fclose($f);

?>

 

...
Zgłoś jeśli naruszono regulamin