[PHP] Jak wygenerować bezpieczne, losowe hasło dla użytkownika?
Chcesz wygenerować użytkownikowi losowe hasło, którego będzie używał do chwili, aż nie zmieni go na inne.
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);
?>