У меня проблема с кодом ниже. Это было извлечено из Вот и слегка изменены, чтобы включить проверку и запуск, когда соответствующие формы были представлены и проходят проверку. Проблема с хешированием пароля.
Хешированный пароль не совпадает с паролем в базе данных, даже если сам пароль и соль идентичны. Я проверил переменную $ hashed_password относительно того, что записывается в базу данных. Они идеально сочетаются. На стороне входа соль совпадает, но когда используется тот же пароль, часть после соли отличается? Результаты выглядят так:
$ 2a $ 05 $ Bj79bEbmWG9GeMbBAIXID.zMtNecb3B5qWkiGZrSccWcefQG7IXUy
$ 2a $ 05 $ Bj79bEbmWG9GeMbBAIXID.6qNLDcZ21XAKoSOIriqTxlAUjjTygoy
Возникла проблема с вашим именем пользователя или паролем.
Если я не пропущу что-то очевидное, единственное, что я могу себе представить, — это другой алгоритм, используемый при регистрации при входе в систему, но я не уверен, как это подтвердить или исправить. Любая помощь с благодарностью.
<?php
$password = mysql_real_escape_string($_POST['password']);
$username = mysql_real_escape_string($_POST['username']);
//This string tells crypt to use blowfish for 5 rounds.
$Blowfish_Pre = '$2a$05$';
$Blowfish_End = '$';
// // PHP code you need to register a user
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['register'])) {
global $valid;
user_reg_validate($con, $_POST['username'], $_POST['email'], $_POST['password'], $_POST ['password2']);
if ($valid != false) {
// Blowfish accepts these characters for salts.
$Allowed_Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$Chars_Len = 63;
// 18 would be secure as well.
$Salt_Length = 21;
$mysql_date = date( 'Y-m-d' );
$salt = "";
for($i=0; $i<$Salt_Length; $i++) {
$salt .= $Allowed_Chars[mt_rand(0,$Chars_Len)];
}
$bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
$hashed_password = crypt($password, $bcrypt_salt);
$sql = "INSERT INTO login (username, salt, password) VALUES ('$username', '$salt', '$hashed_password')";
mysqli_query($con, $sql) or die( mysql_error() );
}
}
if($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['login'])) {
global $valid;
user_login_validate($con, $_POST['username'], $_POST['password']);
if($valid != false) {
// Now to verify a user’s password
$sql = "SELECT salt, password FROM login WHERE username='$username'";
$result = mysqli_query($con, $sql) or die( mysql_error() );
$row = mysqli_fetch_assoc($result);
$hashed_pass = crypt($password, $Blowfish_Pre . $row['salt'] . $Blowfish_End);
echo $hashed_pass . "</br>";
echo $row['password'] . "</br>";
if ($hashed_pass == $row['password']) {
echo 'Password verified!';
} else {
echo 'There was a problem with your user name or password.';
}
}
}
?>
Вы можете иметь то же самое бесплатно, просто используйте функцию password_hash (). Эта функция генерирует криптографически безопасную соль и делает ее частью хеш-значения, поэтому нет необходимости в отдельном поле базы данных. Он также использует $2y
подпись и добавляет разумное значение по умолчанию для параметра стоимости (5 очень низкий).
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
// 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);
Также помните, что ваш код не защищен от SQL-инъекций. Как только вы сможете переключиться на подготовленные операторы, написание кода станет еще проще, чем создание запроса, как вы это делали, и MYSQLI, и PDO поддерживают его. это ответ мог бы дать вам начало.
Других решений пока нет …