Как проверить пароль в базе данных Mysql против введенного, если мы используем солевую технику?

У меня есть система входа и регистрации на моем веб-сайте. Я хочу использовать мощный способ шифрования паролей пользователей перед их сохранением в моей базе данных MySQL. Я использую этот код для шифрования паролей:

function better_crypt($input, $rounds = 7)
{
$salt = "";
$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
for($i=0; $i < 22; $i++) {
$salt .= $salt_chars[array_rand($salt_chars)];
}
return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt);
}

$user_password = "123456";
$password_hash = better_crypt($user_password);
//$password_hash = "$2a$07$t8Omz2TZhz5u0AI3l8uB4uQxzqYZCoqEsQmRo1gr.Viq5UnNReGMy";=> store in database

И когда пользователь пытается войти, я использую это, чтобы проверить пароль:

$password_entered = "123456";

$database_password_hash = "$2a$07$t8Omz2TZhz5u0AI3l8uB4uQxzqYZCoqEsQmRo1gr.Viq5UnNReGMy";// I get this from database depending on the username

if(crypt($password_entered, $database_password_hash) == $database_password_hash)
{
echo 'password is correct';
}
else
{
echo 'not correct';
}

я использую crypt потому что моя версия PHP не поддерживает password_verify ,

Моя проблема: я все еще получаю not correct все время .

Я хочу дать каждому пользователю разные salt' and I want to check it bycrypt`

Нужно ли что-то менять в этом коде? Почему это дает not correct все время?

0

Решение

Знаки доллара в вашей строке в двойных кавычках интерполируются как переменные, поэтому фактическое значение $ database_password_hash в вашем примере равно $ 2a $ 07.Viq5UnNReGMy. Вместо этого используйте одинарные кавычки.

Это работает для меня:

$password_entered = '123456';
$database_password_hash = '$2a$07$t8Omz2TZhz5u0AI3l8uB4uQxzqYZCoqEsQmRo1gr.Viq5UnNReGMy';// I get this from database depending on the username
if(crypt($password_entered, $database_password_hash) === $database_password_hash) {
echo 'password is correct';
} else {
echo 'not correct';
}
1

Другие решения

Вы знаете, что существует пакет совместимости для password_hash() функционировать? Вероятно, вы можете использовать эту функцию непосредственно тогда, позже, когда вы переключитесь на новую версию PHP, вы можете просто удалить включение для этой библиотеки, и код все равно будет работать.

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

Эта функция работает, потому что она включает соль в результирующее хеш-значение. Функция password_verify() может извлечь его оттуда. На самом деле это crypt() функция делает это, так что ваш код будет также включать соль.

1

Во-первых, когда вы создаете хеш с помощью SALT, вам нужно вернуть и хеш, и соль, которые использовались при создании хеша.

function better_crypt($input, $rounds = 7)
{
$salt = '';
$salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9));
for($i=0; $i < 22; $i++) {
$salt .= $salt_chars[array_rand($salt_chars)];
}
$salt = sprintf('$2a$%02d$', $rounds) . $salt);
$hash = crypt($input, $salt);
return( array('hash' => $hash, 'salt' => $salt);
}$user_password = '123456';
$better_result = better_crypt($user_password);
// Store the $better_result['hash']
// AND
// $better_result['salt']
// to the users table in the database

Теперь, когда вы проверяете, что при входе в систему использовался правильный пароль, вы делаете: —

// Get from the database the users hashed password and the salt used to create the hash.

if( crypt($password_entered, $salt_from_users_row) == $database_password_hash)
{
echo 'password is correct';
} else {
echo 'not correct';
}
0

Склеп всегда смущает меня. Вот почему я просто использую базовые хэш-функции.

function verifyPassword($input, $dbHashOfPassword, $dbSavedSaltForThisUser)
{
return $dbHashOfPassword === $this->hashPassword($input, $dbSavedSaltForThisUser);
}

function hashPassword($password, $salt)
{
return hash('SHA512', $password.$salt);
}

function createSalt($username, $userid, $systemTime, $anything)
{
//Do stuff to create a Unique Salt for your user.
//This has to be stored in the database as well but
//will have the impact that every attacked userdata will
//need there own rainbow table created.
return hash('MD5', 'T-'.$systemTime.'-U-'.$username.'-A-'.$anything.'-ID-'.$userid.'-E');
}
0
По вопросам рекламы [email protected]