Дадаванне солі ў рэгістрацыю
Такім чынам, вы ўжо ведаеце, што хешаванне праз
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
, у якім
мы будзем захоўваць соль кожнага карыстальніка.
Рэалізуйце апісаную вышэй рэгістрацыю з салёным паролем.