Я читал несколько постов и пробовал разные методы для хранения пароля в MySQL. Я решил использовать crypt
а также salt
и я наконец-то смог вставить его в свою базу данных. Используемый код следующий:
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);
$query = "INSERT INTO users_registered(name , password) VALUES('$name', '$hash')";
mysqli_query($con, $query);
Основная проблема, с которой я боролся в течение нескольких часов, заключается в том, как проверить, верен ли введенный мной пароль. Я уверен, что я делаю что-то не так, но я совершенно новичок в этой области безопасности, и все сообщения, которые я проверял, не работали для меня. Это код, который я использую для проверки:
$name = mysqli_real_escape_string( $con, $_POST['name'] );
$password = mysqli_real_escape_string( $con,$_POST["password"]);
$query = "SELECT * FROM users_registered where name='$name'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_assoc($result);
$hash=$row['password'];
if ($hash->hash==crypt($password, $hash->hash)) {
echo "YEEEESSS";
}
else {
echo "What I'm doing wrooooong!";}
Проблема исходит от if
, но я не уверен, что я должен поставить: S
Любая помощь будет оценена 🙂
Как уже упоминалось в комментариях, лучшим способом является использование password_hash()
Вместо того, чтобы использовать:
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $cost) . $salt;
$hash = crypt($password, $salt);
В моем случае моя версия php была ниже 5.5, и я не смог вставить библиотеку совместим с более низкими версиями, даже если это самый безопасный способ !!
Чтобы проверить, был ли мой сохраненный пароль таким же, какой был введен пользователем через $_POST
, if должен быть изменен следующим образом:
if (crypt($password, $hash) == $hash) {
...
и это сделало трюк !! Примите во внимание, что я только начинающий, и этот метод может быть небезопасным 🙂
Других решений пока нет …