У меня есть страница регистрации, которая позволяет пользователю вставлять пароль, поэтому мне нужно хэшировать его, чтобы он стал более безопасным в базе данных, эта работа отлично
но когда дело доходит до логина, введенный пароль не соответствует регистру, как исправить эту проблему.
это мой первый раз, чтобы использовать хеш, чтобы он не работал, поскольку я хочу
Это код регистра для хэша:
//ADD MD5 hash to the password function cryptPass($input, $rounds = 9) { $salt = ""; $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9')); for($i = 0; $i<22; $i++) { $salt .=$saltChars[array_rand($saltChars)]; } return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt); } $hashedpass = cryptPass($pass1); echo $hashedpass;
пароль хеширования = $ 2y $ 09 $ test $ 5I9x8HWhA4UHi5TMu.AxfdWvZadDCE.LD6HCkKKKZZZQJEN7e
Это код входа для хэша:
function cryptPass($input, $rounds = 9) { $salt = ""; $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9')); for($i = 0; $i<22; $i++) { $salt .=$saltChars[array_rand($saltChars)]; } return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt); } $hashedpass = cryptPass($pass); echo $hashedpass;
хеширующий пароль = $ 2y $ 09 $ test $ 4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e
После регистрации вы создаете уникальную соль. Эта соль теперь является частью хэша. Если вы посмотрите внимательно, вы увидите, что он встроен в первую часть хэша. Чтобы проверить пароль, используйте соль предыдущего пароля хэшированного пароля, чтобы снова использовать ту же соль.
$correctPasswordHash = getPasswordFromDatabase($_POST['username']); $hash = crypt($_POST['password'], $correctPasswordHash); if ($correctPasswordHash === $hash) ...
Чтобы сделать это проще и надежнее, используйте библиотеку password_compat , которая обертывает это в простой в использовании API, который также будет интегрирован в будущую версию PHP. Проверьте его исходный код на правильное использование crypt
, так как есть некоторые проблемы, о которых вам нужно позаботиться. В библиотеке password_compat также используется обычное двоичное сравнение вместо простого ===
для предотвращения атак синхронизации.
Если я правильно понимаю ваш код, код входа в систему генерирует свежую соль, игнорируя тот, который хранится с паролем. Используя разные соли для хэша, один и тот же пароль будет генерировать разные хэши.
Или используйте постоянный солевой перец (прокрутите нижнюю часть этого ответа) , как ответ @ c2:
function cryptPass($input, $rounds = 9) { return crypt($input, sprintf('$2y$%02d$mysalt$', $rounds)); } $hash = cryptPass($pass);
Или используйте ту же соль одновременно:
// Login time (register-time code is unchanged) function cryptPass($input, $salt, $rounds = 9) { return crypt($input, sprintf('$2y$%02d$%s$', $rounds, $salt)); } function checkPass($freshPass, $hashFromDatabase) { $salt = explode('$', $hashfromDatabase, 5); $salt = $salt[3]; return cryptPass($freshPass, $salt) === $hashFromDatabase; }