Dodajanje soli v registracijo
Torej, že veste, da je zgoščevanje z
md5 - nepovraten proces in heker,
ki dobi dostop do zgoščene vrednosti, ne bo mogel pridobiti
gesla iz te zgoščene vrednosti.
Pravzaprav ta trditev ni povsem pravilna - trenutno so zlobni hekerji sestavili knjižnice zgoščenih vrednosti priljubljenih in manj priljubljenih gesel in vsak lahko ugane geslo, tako da preprosto pogugla njegovo zgoščeno vrednost.
Gre za dokaj preprosta, priljubljena gesla.
Poguglajte na primer zgoščeno vrednost 827ccb0eea8a706c4c34a16891f84e7b
in takoj boste v iskanju Googla videli, da je to
geslo '12345'.
Zgoščene vrednosti dovolj zapletenih gesel na ta način ni mogoče razbiti (poskusite).
Lahko se vprašate, v čem je potem problem - recimo, vsi se bomo registrirali s zapletenimi gesli. Vendar obstaja problem - večina uporabnikov ne razmišlja o varnosti svojih podatkov in lahko vnesejo precej preprosta gesla.
Ob registraciji lahko zahtevamo, da si izmislijo
dolžja gesla, tako da na primer omejimo
minimalno število znakov na 6
ali 8, vendar se bodo kljub temu pojavljala
gesla, kot so '123456' ali '12345678'.
Seveda lahko izmislimo pametnejši algoritem za preverjanje zahtevnosti gesla, vendar obstaja druga rešitev.
Bistvo te rešitve je: gesla je treba posoliti. Sol - to je posebna naključna niza, ki se bo dodala geslu ob registraciji in zgoščena vrednost se ne bo več izračunala iz preprostega gesla, temveč iz niza sol+geslo, torej iz soljenega gesla.
To pomeni, da boste ob registraciji naredili najbrž nekaj takega:
<?php
$salt = '1sJg3hfdf'; // sol - zapletena naključna niza
$password = md5($salt . $_POST['password']); // pretvorimo geslo v soljeno zgoščeno vrednost
?>
Poleg tega bo sol različna za vsakega uporabnika, generirati jo je treba naključno v času registracije.
Tukaj je pripravljena funkcija, ki bo to naredila:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // dolžina soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // znak iz ASCII-tabele
}
return $salt;
}
?>
S to funkcijo lahko našo kodo prepišemo takole:
<?php
$salt = generateSalt(); // sol
$password = md5($salt . $_POST['password']); // soljeno geslo
?>
Še enkrat ponavljam, da so bile to spremembe ob registraciji - v bazo podatkov shranimo ne le zgoščeno vrednost gesla, temveč zgoščeno vrednost soljenega gesla.
To še ni vse: v tabeli z uporabniki poleg
polja login in password je treba
narediti še polje salt, v katerem
bomo shranjevali sol vsakega uporabnika.
Implementirajte zgoraj opisano registracijo s soljenim geslom.