Винаги трябва да се мисли за сигурност. Ако паролите се съхраняват в обикновен текст, какво би се случило, ако някой нерегламентирано получи достъп до база данните? Той лесно може да чете всички пароли на потребителите. Ето защо се използва техниката, наречена хеширане на пароли, за да се предотврати получаването на потребителските пароли.
Забележка: Хеширането на пароли пак не е сигурен начин, че паролата няма да бъде дехеширана.
В тази статия ще научите как да съхранявате пароли сигурно в база данни, така че дори, ако вашата база данни попада в неподходящи ръце, няма такава голяма опастност от загуби, кражба на пари и други.
Как хеширане в PHP?
- Има различни алгоритми за генериране на хеш на текста. Най-популярните от тях са: MD5, SHA1 и Bcrypt (Blowfish). Всеки от тези алгоритми поддържа PHP.
Нека да започнем с md5() PHP функция, която хешира паролата в съответствие с хеширане на алгоритъм MD5, който съдържа 32 символа, знака, букви и/или цифри, както щете го наречете. Следният пример илюстрира процеса на регистрация:
Код за потвърждение: Избери целия код
$potrebitel = $_POST["potrebitel"];
$parola = $_POST["parola"];
// създаване на връзка към MySQL
// ...
// обработка на формите
// ...
// създаване на MD5 хеш на паролата
$parola = md5($parola);
// запазване на информацията в MySQL
$sql = "INSERT INTO users (potrebitel, parola) VALUES (:potrebitel, :parola)";
$terrorsec = $db->prepare($sql);
$terrorsec->execute(array(
":potrebitel" => $potrebitel,
":parola" => $parola
));
Код за потвърждение: Избери целия код
$potrebitel = $_POST["potrebitel"];
$parola = $_POST["parola"];
// създаване на връзка към MySQL
// ...
// обработка на формите
// ...
// създаване на MD5 хеш на паролата
$parola = md5($parola);
// извличане на информация от базата данни
$sql = "SELECT * FROM users WHERE potrebitel=:potrebitel AND parola=:parola";
$terrorsec = $db--->prepare($sql);
$terrorsec->execute(array(
":potrebitel" => $potrebitel,
":parola" => $parola
));
$row = $terrorsec->fetch();
Ако генерирате MD5 хеш на низ "moqtaparola", то тогава ще изглежда по следния начин:
А "moqtaparola" в SHA1 вид ще изглежда по следният начин:842601d4f3deec4fdb352bfc060e40e8
Никога не прехеширайте парола по два или повече пъти. Това не прибавя допълнителна сигурност, а по-скоро прави хеша слаб и неефективен. Например, не се опитвайте да създадете MD5 хеш на паролата, а след това го обърнете към sha1() (това е груба грешка).3628fdc41f289033fec89bdb6b57c8187ea08d81
Изследователите открили няколко слабости в SHA1 и MD5. Ето защо съвременните PHP приложения, не трябва да използват тези две хеш функции. Вместо това, те трябва да използват хеш алгоритми SHA2, SHA256 или sha512. Както подсказва името, те произвеждат хеш с дължина от 256 и 512 бита. Те са нови и много по-силни, сравнени с MD5. С увеличаване на броя на битовете, вероятността за атака намалява. Всяка от двете е повече от достатъчна, за да се гарантира вашата сигурност.
Следният код показва как да използвате SHA256 в PHP:
Код за потвърждение: Избери целия код
$parola = hash("sha256", $parola);
Параноята за сигурността на вашата система е добър порок, така че, нека да разгледаме този случай. В случая функцията хешира потребителската парола и я съхранява в таблица на база данни. Дори ако някой получави достъп до вашата база данни, тя няма да бъде в състояние да определи първоначалната парола. Но какво се случва, ако въпросният сравни всички хешове на паролите един с друг, и някой от тях са едни и същи? Какво означава това? Това означава, че паролите на тези потребителски акаунти са едни и същи.
Решението е да използвате произволен брой в генерирането на хеш нарича сол. Всеки път, когато се генерира хеш на паролата, ние използваме случаен сол. Ти просто трябва да се генерират случайни числа на определен период и да го добавите към обикновен текстов парола, и след това да го хеш. По този начин, дори ако двете пароли за сметките и генерира хеш не е същото, защото солите, използвани в двата случая са различни.
Следният код показва използването на salt функция:
Код за потвърждение: Избери целия код
define("MAX_LENGTH", 5);
function generiranenahashssalt($parola) {
$mejdinenSalt = md5(uniqid(rand(), true));
$salt = substr($mejdinenSalt, 0, MAX_LENGTH);
return hash("sha256", $parola . $salt);
}
Bcrypt техниката на хеширане е възможно най-сигурният начин.
Код за потвърждение: Избери целия код
function generiranenahesh($parola) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$15y$26$' . substr(md5(uniqid(rand(), true)), 0, 30);
return crypt($parola, $salt);
}
}