Додавање соли при регистрацији
Дакле, већ знате да је хеширање помоћу
md5 - неповратан процес и хакер
који добије приступ хешу неће моћи да добије
лоzинку из тог хеша.
Заправо, ова тврдња није сасвим тачна - тренутно, зли хакери су саставили библиотеке хешева популарних и мање популарних лозинки и било који глупан може да открије лозинку, једноставно претраживањем њеног хеша на Гуглу.
Реч је о довољно једноставним, популарним лозинкама.
Претражите, на пример, хеш 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 табеле
}
return $salt;
}
?>
Помоћу ове функције можемо преписати наш код овако:
<?php
$salt = generateSalt(); // со
$password = md5($salt . $_POST['password']); // посољена лозинка
?>
Још једном ћу поновити да су то биле измене при регистрацији - у базу података чувамо не само хеш лозинке, већ хеш посолене лозинке.
То још није све: у табели са корисницима поред
поља login и password треба
направити још и поље salt, у коме
ћемо чувати со сваког корисника.
Имплементирајте горе описану регистрацију са посоленом лозинком.