Pridávanie soli pri registrácii
Takže už viete, že hashovanie pomocou
md5 je nevratný proces a hacker,
ktorý získa prístup k hashu, nebude môcť
z tohto hashu získať heslo.
V skutočnosti toto tvrdenie nie je celkom správne - v súčasnosti zlí hackeri zostavili knižnice hashov populárnych a menej populárnych hesiel a každý hlupák môže heslo rozlúštiť jednoducho vyhľadaním jeho hashu.
Ide o dostatočne jednoduché, populárne heslá.
Vyhľadajte napríklad hash 827ccb0eea8a706c4c34a16891f84e7b
a hneď vo vyhľadávaní uvidíte, že to je
heslo '12345'.
Hashe dostatočne zložitých hesiel týmto spôsobom nejde rozlúštiť (skúste).
Môžete sa opýtať, v čom je potom problém - nech sa všetci zaregistrujeme so zložitými heslami. Je tu však problém - väčšina používateľov nemyslí na bezpečnosť svojich údajov a môžu zadávať dosť jednoduché heslá.
Môžeme pri registrácii nútiť vymýšľať
dlhšie heslá, obmedzovaním napríklad
minimálneho počtu znakov na 6
alebo 8, avšak aj tak sa budú objavovať
heslá ako '123456' alebo '12345678'.
Samozrejme, môžeme vymyslieť inteligentnejší algoritmus kontroli zložitosti hesla, ale existuje iné riešenie.
Podstatou tohto riešenia je: heslá treba posoliť. Soľ - je to špeciálny náhodný reťazec, ktorý sa pridá k heslu počas registrácie a hash sa už bude počítať nie z jednoduchého hesla, ale z reťazca soľ+heslo, teda z osoleného hesla.
To znamená, že pri registrácii urobíte niečo takéto:
<?php
$salt = '1sJg3hfdf'; // soľ - zložitý náhodný reťazec
$password = md5($salt . $_POST['password']); // premeníme heslo na osolený hash
?>
Soľ bude pre každého používateľa iná, treba ju generovať náhodne v čase registrácie.
Tu je hotová funkcia, ktorá to urobí:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // dĺžka soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // znak z ASCII tabuľky
}
return $salt;
}
?>
Pomocou tejto funkcie môžeme prepísať náš kód takto:
<?php
$salt = generateSalt(); // soľ
$password = md5($salt . $_POST['password']); // osolené heslo
?>
Ešte raz zopakujem, že toto boli zmeny pri registrácii - do DB ukladáme nie jednoduchý hash hesla, ale hash osoleného hesla.
To ešte nie je všetko: v tabuľke s používateľmi okrem
pola login a password je potrebné
vytvoriť aj pole salt, v ktorom
budeme ukladať soľ každého používateľa.
Realizujte vyššie opísanú registráciu s osoleným heslom.