Generować losowe hasła, z nie powtarzającymi się znakami

piechnat

Rozwiązanie dla początkujących

Można przy pomocy takiej funkcji:

function  generujHaslo($dlugosc_hasla  =  8,  $zestaw_znakow  =  'abcdefghijklmnopqrstuvwxyz0123456789')
{
  srand(microtime(true));
  $zakres=strlen($zestaw_znakow);
  for ($i=0;$i<$dlugosc_hasla;$i++)
  {
     --$zakres;
     $haslo.=$zestaw_znakow[$wylosowano=(rand(0,$zakres))];
     $tmp=$zestaw_znakow[$wylosowano];
     @$zestaw_znakow[$wylosowano]=$zestaw_znakow[$zakres];
     @$zestaw_znakow[$zakres]=$tmp;
  }
  return $haslo;
}

Przykład:

echo 'Losowe hasło: '.generujHaslo();

Poprawne rozwiązanie

Do generowania haseł, upewnij się że korzystasz z funkcji która jest kryptograficznie bezpieczna:

Funkcje microtime() oraz rand() nie są kryptograficznie bezpieczne; a więc da się łatwo odgadnąć jakie hasło zostanie przez nie wygenerowane.

8 komentarzy

Mam nadzieję, że niczego nie zepsułem :P

trochę zoptymalizowałem ten kod, mimo że raczej php nie znam.

Ludzie! Chyba od tego mamy parametry w funkcji żeby je definiować, a nie siedzi sobie w środku długość i znaki a parametrów zero.

Demonical Monk: Mamy też domniemanie.. I co! teraz aby na szybko wygenerowac haslo musze podawac caly alfabet????? Chyba cos nie pasuje....
Tak powinna wygladac funkcja:

function  generujHaslo($dlugosc_hasla  =  8,  $zestaw_znakow  =  'abcdefghijklmnopqrstuvwxyz0123456789')
{
   srand((double)microtime()  *  1000000);

   while(strlen($haslo)  <  $dlugosc_hasla)
   {
     $znak  =  $zestaw_znakow[rand(0,  strlen($zestaw_znakow)  -  1)];
     if(!is_integer(strpos($haslo,  $znak)))  $haslo  .=  $znak;
   }
   return  $haslo;
}

Takie coś jak długość hasła czy z jakich znaków ma być, to dodatki.. W domniemaniu się pisze.

w którym php jest napisany ten skrypt, bo mi nie działa??

Ło matko, ależ strasznie nieoptymalny kod O_o
Totalna masakra

No tak, data powstania: 2003-02-06 19:38

podobne używając for zamiast while unikniemy ciągłego wywoływania strlen($haslo)
$dlugosc_hasla jako paramtr funkcji dodał by trochę uniwersalności

funkcje strlen($zestaw_znakow) - 1 - powinnismy wystawic przed petle, co pozwoli na szybsze dzialanie programu