Svaka iole komplikovanija PHP aplikacija zahteva čuvanje username/password parova u bazi podataka, radi omogućavanja korisnicima da se prijave na nju koristeći svoju lozinku. Korisnička lozinka je vrlo osetljiv podatak i njeno čuvanje u bazi podataka u kriptovanom obliku je obavezno.
Ovakav način čuvanja će onemogućiti eventualnog napadača, koji je došao do neovlašćenog pristupa podacima iz baze, da sazna lozinke svih korisnika vaše aplikacije. S obzirom na to da korisnici često koriste iste lozinke za razne servise (webmail, facebook, ebanking i sl.), napadač bi mogao da iskoristi kompromitovane lozinke da pristupi čitavom nizu servisa koje koristi kompromitovani korisnik.
Najbolji način za zaštitu korisičkih lozinki je korišćenje hashing algoritma za kriptovanje lozinki. Hash algoritmi su ireverzibilni, što znači da ne postoji analitički algoritam za dekriptovanje jednom hashovane lozinke, to jest ni programer koji je razvio aplikaciju ne može da sazna lozinke svojih korisnika iako ima pun pristup bazi. Provera da li je korisnik uneo ispravnu username/password kombinaciju se u tom slučaju vrši poređenjem hashovanih vrednosti, a ne originalnih unosa.
<?php
//Snimanje lozinke u bazu
$LozinkaHash=crypt($LozinkaOriginal,’neki salt string’);
$Upit=”UPDATE KorisniciSpisak SET LozinkaKorisnicka=’$LozinkaHash’ WHERE UsernameKorisnicki=’$KorisnickoIme'”;
mysql_query($Upit);
//Provera unete lozinke
$LozinkaUnetaHash=crypt($LozinkaUneta,’neki salt string’);
$Upit=”SELECT * FROM KorisniciSpisak WHERE LozinkaKorisnicka=’$LozinkaUnetaHash’ AND UsernameKorisnicki=’$KorisnickoIme'”;
//Polja LozinkaKorisnicka i UsernameKorisnicki bi trebalo indeksirati radi ubrzanja izvrsavanja upita
?>
Naravno uvek je potrebno izvršiti pravilnu sanitizaciju prosleđenih stringova, o čemu možete više da pročitate u članku o sanitizaciji u PHP-u.
Za samo hashovanje ne bi trebalo koristiti zastarele MD5 ili SHA algoritme. Oni su razvijeni relativno davno sa ciljem da budu brzi. Međutim, sa modernom opremom je moguće jako brzo razbiti lozinke hashovane ovim algoritmima primenom grube sile (brute force).
Najprostija zamena je crypt() PHP funkcija koja u osnovnoj varijanti koristi algoritam zasnovan na DES enkripciji.
Takođe je preporuka da se prilikom hashovanja koristi takozvani ‘salt’. Salt je string koji se dodaje prilikom hashovanja sa ciljem dobijanja drugačijeg rezultata od onog koji bi se dobio primenom standardnog algoritma bez salta. Ovakve hash rezultate nije moguće prosto dekriptovati koristeći javne lookup tabele sa unapred ubačenim parovima originalni string -> hashovani string (takozvane rainbow tables), što dodaje sigurnost enkripciji lozinki.
Na kraju uvek važi napomena koja nije direktno vezana za samu temu ovog teksta, ali je jako važna – Pažljivo birajte lozinke koje koristite i uvek imajte u vidu da moderni kompjuteri vrlo jeftino mogu da urade ogromnu količinu proračuna i grubom silom razbiju lozinke koje su pre samo 10 godina bile ‘neprobojne’. Preporuke o biranju najsigurnije lozinke možete pročitati u članku Kako odabrati sigurnu lozinku.
Kao i uvek možete nam postaviti pitanja direktno na blogu ili preko našeg twitter naloga @Limundogradnja