Это хороший/безопасный способ хэширования паролей 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);
    }
}

person Community    schedule 02.04.2014    source источник
comment
Если вы используете › PHP 5.5, вы можете использовать встроенную функцию PHP password_hash. php.net/manual/en/function.password-hash.php< /а>   -  person Sarvap Praharanayuthan    schedule 02.04.2014
comment
Да, но я хочу, чтобы мои скрипты работали почти на всех версиях.   -  person    schedule 02.04.2014
comment
Я бы рекомендовал генерировать случайные соли, а не хранить их в массиве.   -  person Dave Chen    schedule 02.04.2014
comment
Я подумал, что было бы лучше хешировать пароли вместе с паролями, что невозможно в случае случайных паролей. Я имею в виду, что я не хочу, чтобы хэш пароля сохранялся как подстрока между солью (солями)   -  person    schedule 02.04.2014
comment
См. также фреймворк хеширования паролей PHP (PHPass) Openwall. Он портативный и защищен от ряда распространенных атак на пароли пользователей. Парень, написавший фреймворк (SolarDesigner), — это тот же парень, который написал John The Ripper, и сидит как судья в Соревновании по хэшированию паролей. Так что он кое-что знает об атаках на пароли.   -  person jww    schedule 12.10.2014


Ответы (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 библиотека. Кстати, ваша схема с постоянными "солями" практически не защищает.

person martinstoeckli    schedule 02.04.2014
comment
Большое спасибо за это, я также хочу обзор для моей функции, хорошо ли ее использовать? - person ; 02.04.2014
comment
@Subhanker - мне жаль вас разочаровывать, но ваша схема с постоянными солями крайне небезопасна. Столько всего сделано неправильно, что я бы порекомендовал прочитать мое руководство по безопасному хранению паролей< /а> первый. - person martinstoeckli; 02.04.2014