我怎么能用crypt和blowfish做一个登录表单?

时间:2013-08-08 22:25:36

标签: php forms mysqli blowfish crypt

我使用下一个代码注册用户:名称和密码,存储密码我使用crypt()和blowfish,它可以工作,但我不知道如何在登录表单中解密密码< / p>

 $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();

1 个答案:

答案 0 :(得分:1)

请在PHP 5.5中使用全新的密码哈希API。如果您使用的是旧版本,请使用https://github.com/ircmaxell/password_compat在PHP中获得与5.3.7版本相同的功能。

用法非常简单:

创建帐户时:

$hash = password_hash($password);

将哈希存储在数据库中。

验证

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

有关详细信息,请参阅文档!

请注意,您必须从数据库中读取散列密码才能获得它所使用的盐。这也是代码中的错误。在将登录密码与原始哈希进行比较时,无法创建随机盐渍哈希。您必须比较两个哈希值,并且必须使用与原始密码相同的盐对登录密码进行哈希处理。否则哈希值将不匹配。