Přidání soli do registrace
Takže už víte, že hashování pomocí
md5 - je nevratný proces a hacker,
který získá přístup k hashi, nebude moci získat
z tohoto hashe heslo.
Ve skutečnosti toto tvrzení není úplně správné - v současné době zlí hackeři sestavili knihovny hashů populárních a méně populárních hesel a každý hlupák může heslo rozluštit prostě vygooglením jeho hashe.
Jde o dostatečně jednoduchá, populární hesla.
Vygooglete například hash 827ccb0eea8a706c4c34a16891f84e7b
a hned ve vyhledávání Googlu uvidíte, že to je
heslo '12345'.
Hashe dostatečně složitých hesel tímto způsobem nelze rozluštit (zkuste).
Můžete se ptát, v čem je pak problém - pojďme se všichni registrovat se složitými hesly. Existuje však problém - většina uživatelů nepřemýšlí o bezpečnosti svých dat a mohou zadávat dostatečně jednoduchá hesla.
Při registraci můžeme nutit vymýšlet
delší hesla tím, že omezíme například
minimální počet znaků na 6
nebo 8, avšak i tak se budou objevovat
hesla jako '123456' nebo '12345678'.
Lze samozřejmě vymyslet chytřejší algoritmus kontroly složitosti hesla, ale existuje jiné řešení.
Podstata tohoto řešení je taková: hesla je třeba posolit. Sůl - je speciální náhodný řetězec, který se přidá k heslu při registraci a hash se bude počítat ne z prostého hesla, ale z řetězce sůl+heslo, tedy z osoleného hesla.
To znamená, že při registraci budete dělat něco takového:
<?php
$salt = '1sJg3hfdf'; // sůl - složitý náhodný řetězec
$password = md5($salt . $_POST['password']); // převedeme heslo na osolený hash
?>
Přičemž sůl bude pro každého uživatele jiná, je třeba ji generovat náhodně v momentě registrace.
Zde je hotová funkce, která to udělá:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // délka soli
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // znak z ASCII tabulky
}
return $salt;
}
?>
S pomocí této funkce můžeme přepsat náš kód takto:
<?php
$salt = generateSalt(); // sůl
$password = md5($salt . $_POST['password']); // osolené heslo
?>
Ještě jednou zopakuji, že to byly změny při registraci - do databáze ukládáme ne prostý hash hesla, ale hash osoleného hesla.
To ještě není vše: v tabulce s uživateli kromě
pole login a password je třeba
vytvořit ještě pole salt, ve kterém
budeme ukládat sůl každého uživatele.
Realizujte výše popsanou registraci s osoleným heslem.