Добавяне на сол при регистрация
И така, вече знаете, че хеширането чрез
md5 е необратим процес и хакер,
получил достъп до хеша, няма да може да получи
парола от този хеш.
Всъщност това твърдение не е напълно вярно - в настояще време зли хакери са съставили библиотеки с хешове на популярни и не много пароли и всеки глупак може да разгадае парола, просто като потърси хеша в Google.
Става дума за достатъчно прости, популярни пароли.
Потърсете в Google, например, хеша 827ccb0eea8a706c4c34a16891f84e7b
и веднага в резултатите от търсенето ще видите, че това е
парола '12345'.
Хешовете на достатъчно сложни пароли по този начин не могат да бъдат разгадани (опитайте).
Може да попитате, какъв е проблемът тогава - нека всички ние да се регистрираме със сложни пароли. Има обаче проблем - повечето потребители не мислят за сигурността на своите данни и може да въвеждат достатъчно прости пароли.
Можем при регистрация да задължаваме да се измислят
по-дълги пароли, като ограничаваме, например,
минималния брой символи на 6
или 8, но въпреки това ще се появяват
пароли като '123456' или '12345678'.
Може, разбира се, да се измисли по-умен алгоритъм за проверка на сложността на паролата, но има друго решение.
Същността на това решение е: паролите трябва да се осолят. Солта е специален случаен низ, който ще се добавя към паролата при регистрация и хешът вече ще се изчислява не от обикновена парола, а от низа сол+парола, тоест от осолената парола.
Тоест при регистрация ще правите нещо подобно на това:
<?php
$salt = '1sJg3hfdf'; // сол - сложен случаен низ
$password = md5($salt . $_POST['password']); // преобразуваме паролата в осолен хеш
?>
При това солта ще бъде различна за всеки потребител, тя трябва да се генерира по случаен начин в момента на регистрация.
Ето готова функция, която ще направи това:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // дължина на солта
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // символ от ASCII-table
}
return $salt;
}
?>
С помощта на тази функция може да пренапишем нашия код ето така:
<?php
$salt = generateSalt(); // сол
$password = md5($salt . $_POST['password']); // осолена парола
?>
Още веднъж повторявам, че това бяха промени при регистрация - в базата данни запазваме не просто хеш на паролата, а хеш на осолената парола.
Това още не е всичко: в таблицата с потребители освен
полетата login и password трябва
да се направи и поле salt, в което
ще съхраняваме солта на всеки потребител.
Реализирайте описаната по-горе регистрация с осолена парола.