Dodavanje soli pri registraciji
Dakle, već znate da je heširanje preko
md5 - nepovratan proces i haker
koji dobije pristup hešu, neće moći da dobije
lozinku na osnovu tog heša.
Zapravo ova tvrdnja nije sasvim tačna - trenutno zli hakeri su sastavili biblioteke heševa popularnih i manje popularnih lozinki i svaki budala može da provali lozinku, jednostavno pretražujući njen heš.
Reč je o dovoljno jednostavnim, popularnim lozinkama.
Pretražite, na primer, heš 827ccb0eea8a706c4c34a16891f84e7b
i odmah u pretrazi Gugla videćete da je to
lozinka '12345'.
Dovoljno složene lozinke se na ovaj način ne mogu provaliti (probajte).
Možete pitati, u čemu je onda problem - hajde svi da se registrujemo sa složenim lozinkama. Međutim, postoji problem - većina korisnika ne razmišlja o bezbednosti svojih podataka i mogu unositi dovoljno jednostavne lozinke.
Možemo pri registraciji da nateramo korisnike da smišljaju
duže lozinke, ograničavajući, na primer,
minimalni broj karaktera na 6
ili 8, međutim, i dalje će se pojavljivati
lozinke poput '123456' ili '12345678'.
Možemo, naravno, smisliti pametniji algoritam provere složenosti lozinke, ali postoji drugo rešenje.
Suština tog rešenja je sledeća: lozinke treba posoliti. So - to je specijalni slučajni string, koji će se dodavati lozinki pri registraciji i heš će se računati ne od obične lozinke, već od stringa so+lozinka, to jest od slane lozinke.
To znači da ćete pri registraciji raditi nešto poput ovoga:
<?php
$salt = '1sJg3hfdf'; // so - složeni slučajni string
$password = md5($salt . $_POST['password']); // pretvaramo lozinku u slani heš
?>
Pritom će so biti različita za svakog korisnika, treba je generisati slučajno u momentu registracije.
Evo gotove funkcije koja će to uraditi:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // dužina soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter iz ASCII-tabele
}
return $salt;
}
?>
Pomoću ove funkcije možemo prepisati naš kod ovako:
<?php
$salt = generateSalt(); // so
$password = md5($salt . $_POST['password']); // slana lozinka
?>
Još jednom da ponovim, ovo su bile izmene pri registraciji - u bazu podataka čuvamo ne samo heš lozinke, već heš slane lozinke.
To još nije sve: u tabeli sa korisnicima pored
polja login i password treba
napraviti još i polje salt, u kojem
ćemo čuvati so svakog korisnika.
Realizujte gore opisanu registraciju sa slanom lozinkom.