【发布时间】:2015-11-14 10:11:20
【问题描述】:
我对下面的代码有疑问。它是从here 中提取的,并稍作修改以包含验证,并在提交适当的表单并通过验证时触发。问题在于密码的散列。
哈希密码与数据库中的密码不匹配,即使密码本身和 salt 相同。我检查了 $hashed_password 变量与写入数据库的内容。他们完美匹配。在登录端,salt匹配,但是当使用相同的密码时,salt后面的部分不一样?结果如下所示:
$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.';
}
}
}
?>
【问题讨论】:
-
您的盐和方法似乎正确,您能验证密码是否匹配吗?我还想指出,您的盐生成在密码学上并不强,请使用
openssl_random_pseudo_bytes或mcrypt_create_iv -
@Halcyon 让我走上了正确的道路。我最终在我的表单中有一个错误标记的字段,我不得不对验证功能进行一些更改以反映这一点。它正在工作。我要去研究你提到的盐发生器。谢谢!
标签: php hash passwords blowfish crypt