Ответ 1
Хорошо, пропустите это по одному.
Во-первых, это хеширование, а не шифрование. Шифрование является двусторонним, хеширование - это один из способов. Мы хотим хэш. Мы никогда не хотим шифровать. Да, терминология имеет значение. Используйте правильную терминологию.
Затем каждый вызов password_hash
означает предположительно, чтобы вернуть другой хеш. Это потому, что он генерирует сильную случайную соль. Вот как это было разработано и как вы действительно должны его использовать.
Кроме того, НЕ НЕ делать "перец", добавляя __STR
до и после пароля. Вы ничего не делаете, но потенциально ослабляете пароль пользователей (что не очень хорошо). Если вам нужна дополнительная информация о том, почему эта плохая идея: Прочитать этот ответ.
Продолжая, я настоятельно рекомендую вам не использовать crypt
напрямую. На самом деле удивительно легко завинчивать и генерировать чрезвычайно слабые хеши. Вот почему был разработан дизайн password_*
api. crypt
- библиотека низкого уровня, вы хотите использовать библиотеку высокого уровня в своем коде. Для получения дополнительной информации о способах испортить bcrypt, просмотрите мой блог: Семь способов накрутить Bcrypt.
API-интерфейс Password был разработан как простой универсальный магазин. Если он не работает для вас, проверьте следующие вещи:
-
Используете ли вы PHP >= 5.5.0? Или вы используете PHP >= 5.3.7 с password_compat?
-
Является ли ваш столбец базы данных достаточно широким?
Должно быть не менее длиной 60 символов.
-
Проверяете ли вы, что результатом функции является строка, а не
bool(false)
?Если есть внутренняя ошибка, она вернет не строку из
password_hash
. -
Вы получаете какие-либо ошибки?
Вы включили
error_reporting
в свою максимальную настройку (рекомендую-1
поймать все) и проверили, что код не вызывает ошибок? -
Вы уверены, что используете его правильно?
function saveUser($username, $password) { $hash = password_hash($password, PASSWORD_BCRYPT); // save $username and $hash to db } function login($username, $password) { // fetch $hash from db return password_verify($password, $hash); }
Обратите внимание, что каждый из них следует вызывать только один раз.
-
-
Используете ли вы PHP < 5.3.7 с password_compat? Если это так, это ваша проблема. Вы используете библиотеку совместимости на неподдерживаемой версии PHP. Вы можете заставить его работать (некоторые дистрибутивы RedHat предоставили необходимые исправления), но вы используете неподдерживаемую версию. Обновите до разумного выпуска.
Если все остальное не удается, попробуйте запустить этот код и сообщить результат:
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
$test = crypt("password", $hash);
$pass = $test == $hash;
echo "Test for functionality of compat library: " . ($pass ? "Pass" : "Fail");
echo "\n";
Если это возвращает Fail
, вы используете неподдерживаемую версию PHP и должны обновляться. Если он возвращает pass, то ошибка находится где-то в вашей логике (библиотека работает нормально).