Это хороший / безопасный способ для хэширования паролей PHP
Я использовал:
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
для хэширования паролей, но это несовместимо с версией PHP ниже, чем 5.3.7. Поэтому я создал эту небольшую функцию для генерации и проверки паролей. Но поскольку я не профессионал в области безопасности, я хочу знать, является ли она достаточно безопасной или все еще небезопасной.
Моя функция:
//$hash variable is also used to check weather we are creating or verifying passwords.
function password($password,$hash=FALSE){
$salt=array("hfuiliffa","wiaelfbs","usfewl","fr6j5","gwg8","bs4$","fgthwv");//An array of salts
if ($hash){
foreach ($salt as $s1)
foreach ($salt as $s2)
if ($s1.sha1($s2.$password)===$hash)
return true;
return FALSE;//If we are still here means time to return false.
}else {
return $salt[array_rand($salt)].sha1($salt[array_rand($salt)].$password);
}
}
1 ответ
Лучшее, что вы можете сделать, это использовать новую функцию password_hash (). Как вы уже знаете, для PHP версии 5.3.7 работает пакет совместимости. снизу вверх.
Если вам действительно нужно поддерживать более низкие версии PHP, вы можете заменить параметр crypt с "$2y$%02d$" на "$2a$%02d$", это также создаст хеш BCrypt. Это лучшее, что вы можете сделать со старыми версиями. В качестве альтернативы вы можете посмотреть пример кода на моей домашней странице.
if (version_compare(PHP_VERSION, '5.3.7') >= 0)
$algorithm = '$2y$%02d$'; // BCrypt, with fixed unicode problem
else
$algorithm = '$2a$%02d$'; // BCrypt
Если вам абсолютно необходимо поддерживать PHP 4.x, поддержка BCrypt отсутствует, в этом случае я бы рекомендовал использовать библиотеку phpass. Кстати, ваша схема с постоянными "солями" практически не дает защиты.