Shtimi i kripës në regjistrim
Pra, ju tashmë e dini se hash-imi përmes
md5 - është një proces i pakthyeshëm dhe hakeri,
që i ka hyrë hash-it, nuk do të jetë në gjendje të marrë
përmes këtij hash-i fjalëkalimin.
Në fakt kjo deklaratë nuk është plotësisht e saktë - aktualisht hakerët e ligj kanë përpiluar biblioteka hash-esh të fjalëkalimeve popullorë dhe jo dhe çdo budalla mund ta zbulojë fjalëkalimin, thjesht duke e kërkuar hash-in e tij në Google.
Bëhet fjalë për fjalëkalime mjaft të thjeshtë, popullorë.
Kërkoni në Google, për shembull, hash-in 827ccb0eea8a706c4c34a16891f84e7b
dhe menjëherë në kërkimin e Google do të shihni se ky është
fjalëkalimi '12345'.
Hash-et e fjalëkalimeve mjaft komplekse nuk mund të zbuloen në këtë mënyrë (provoni).
Mund të pyesni, ku është problemi atëherë - le të gjithë ne të regjistrohemi me fjalëkalime komplekse. Megjithatë, ka një problem - shumica e përdoruesve nuk mendojnë për sigurinë e të dhënave të tyre dhe mund të fusin fjalëkalime mjaft të thjeshtë.
Ne gjatë regjistrimit mund t'i detyrojmë të zgjedhin
fjalëkalime më të gjatë, duke kufizuar, për shembull,
numrin minimal të karaktereve në 6
ose 8, megjithatë, prapë do të shfaqen
fjalëkalime si '123456' ose '12345678'.
Mund, sigurisht, të krijohet një algoritëm më i mençur për kontrollin e kompleksitetit të fjalëkalimit, por ka një zgjidhje tjetër.
Thelbi i kësaj zgjidhjeje është: fjalëkalimet duhet të kripen. Kripa - është një varg specifik i rastësishëm, që do të shtohet te fjalëkalimi gjatë regjistrimit dhe hash-i tashmë do të llogaritet jo nga fjalëkalimi i thjeshtë, por nga vargu kripë+fjalëkalim, pra nga fjalëkalimi i kripur.
Pra, gjatë regjistrimit ju do të bëni diçka të tillë:
<?php
$salt = '1sJg3hfdf'; // kripa - një varg i rastësishëm kompleks
$password = md5($salt . $_POST['password']); // e kthejmë fjalëkalimin në hash të kripur
?>
Në këtë rast kripa do të jetë e ndryshme për çdo përdorues, ajo duhet të gjenerohet në mënyrë të rastësishme në momentin e regjistrimit.
Këtu është një funksion i gatshëm, që do ta bëjë këtë:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // gjatësia e kripës
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // karakter nga ASCII-table
}
return $salt;
}
?>
Me ndihmën e këtij funksioni mund të rishkruhet kodi ynë kështu:
<?php
$salt = generateSalt(); // kripa
$password = md5($salt . $_POST['password']); // fjalëkalim i kripur
?>
E përsëris edhe një herë, këto ishin ndryshime gjatë regjistrimit - në DB nuk e ruajmë thjesht hash-in e fjalëkalimit, por hash-in e fjalëkalimit të kripur.
Kjo nuk është e gjitha: në tabelën me përdoruesit përveç
fushës login dhe password duhet
të krijohet edhe fusha salt, në të cilën
do të ruajmë kripën e çdo përdoruesi.
Implementoni regjistrimin e përshkruar më sipër me fjalëkalim të kripur.