Додавање на сол во регистрацијата
Значи, веќе знаете дека хаширањето преку
md5 - е неповратен процес и хакерот,
кој ќе добие пристап до хешот, нема да може да ја добие
лозинката од овој хеш.
Всушност, оваа изјава не е сосема точна - во моментов зли хакери составиле библиотеки на хешови на популарни и не толку популарни лозинки и секој глупак може да ја погоди лозинката, едноставно пребарувајќи го нејзиниот хеш.
Станува збор за доволно едноставни, популарни лозинки.
Пробајте да го пребарате хешот 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, во кое
ќе ја чуваме солта на секој корисник.
Имплементирајте ја опишаната погоре регистрација со солена лозинка.