как я могу создать форму входа с помощью crypt и blowfish?

Я использую следующий код для регистрации пользователя: имя и пароль, для хранения пароля я использую crypt() и blowfish, это работает, но я не знаю, как расшифровать пароль в форме входа

 $user = $_POST['user'];
$password = $_POST['pass'];
function cryptPass($input, $rounds = 5){
$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$', $rounds) . $salt);
}
$password_hash = cryptPass($password);
$cSQL = "INSERT INTO USERDB (NAME, PASS) VALUES(?,?)";
$stmt = $db->prepare($cSQL);
$stmt->bind_param('ss', $name, $password_hash);
$stmt->execute();
$stmt->close();

И это функция расшифровки пароля, но она не работает, где моя ошибка?

$user = $_POST['user'];
$password= $_POST['pass'];
function cryptPass($input, $rounds = 6)
{
$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('$2x$%02d$', $rounds) . $salt);
}
$inputPass = $password;
$pass = $password;
$hashedPass = cryptPass($pass);
$passcrypt = crypt($inputPass, $hashedPass);
$stmt = $db->prepare("SELECT NAME, PASS
FROM  USERDB
WHERE NAME = ? AND PASS =?");
$stmt->bind_param('ss', $user, $passcrypt);
$stmt->execute();
$stmt->close();

person Kakitori    schedule 08.08.2013    source источник


Ответы (1)


Пожалуйста, используйте совершенно новый API хеширования паролей в PHP 5.5. Если вы используете более старую версию, используйте https://github.com/ircmaxell/password_compat, чтобы получить те же функции в PHP, что и в версии 5.3.7.

Использование очень простое:

При создании учетной записи:

$hash = password_hash($password);

Сохраните хэш в базе данных.

Проверка:

if (password_verify($posted_password, $hash_from_db)) { // login }

См. документацию для получения дополнительной информации!

Обратите внимание, что вам нужно прочитать хешированный пароль из базы данных, чтобы получить соль, которую он использовал. Это также ошибка в вашем коде. Вы не можете создать случайный соленый хэш, когда сравниваете пароль для входа с исходным хэшем. Вы должны сравнить два хэша, и пароль для входа должен быть хэширован с той же солью, что и исходный пароль. В противном случае хэши не будут совпадать.

person Sven    schedule 08.08.2013