crypt函数返回不同的结果,使用相同的salt,password和blowfish

时间:2012-08-28 23:59:57

标签: php mysql login blowfish crypt

我已经开始着手制作登录系统并使用crypt函数来编码密码。我的问题是,当我向用户注册用户和密码时,它都可以工作并将用户名密码和盐保存到数据库中。 这是注册的代码:

注意:目前这只是一个测试注册页面

$username=$_POST["username"];
$password=$_POST["password"];


$salt = substr(md5(microtime()),rand(0,26),15);
$hashedPass = crypt($password,'$2y$10$' . $salt);


$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`) VALUES (NULL,'$username','$hashedPass','$salt','test')";
$result=mysql_query($sql);

它加密它是正确的,所以一个真实的例子是密码测试出来: $ 2Y $ 10 $ d395985a2ca993f $$$$$$。k8lxPkUCenMKsOJ6V8tdO6Pl / GI1上/ OW

及其盐用于:
d395985a2ca993f

当我登录时虽然我将盐从数据库中拉出来并尝试以相同的方式重新加密它但我得到了一个不同的加密密码...盐是正确的,密码的第一部分也是如此所以这部分“$ 2y $ 10 $ d395985a2ca993f $$$$$$。”

以下是登录代码:

$sql="SELECT * FROM `users` WHERE username='$user'";
$result=mysql_query($sql);

while($rows=mysql_fetch_array($result)){
$salt=$rows['salt'];
}

$hashedPass = crypt($password,'$2y$10$' . $salt);

$sql="SELECT * FROM `users`WHERE username='$user' AND `password` = '$hashedPass'";
$result=mysql_query($sql);

    if($result) {
        if(mysql_num_rows($result) == 1) {
            echo "Successful Login";

        }
    }

对于登录页面,salt是正确的,但是一旦被哈希处理,这里是密码: $ 2y $ 10 $ d395985a2ca993f $$$$$$。ccy3PKl.TsG26FWJBFXKmpQ3wtk4AqC

第一部分直到完全停止是正确的,它只是下半部分不同

我试图将salt设置为手动的,所以像abc或123只是为了登录和注册页面上的测试,但我仍然有相同的错误

2 个答案:

答案 0 :(得分:0)

将值放入数据库时​​,请确保将其转义。

$escapeUserName= mysql_real_escape_string($username);
$escapeHashedPass= mysql_real_escape_string($hashedPass);
$escapeSalt= mysql_real_escape_string($salt);

$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`)
      VALUES (NULL,'$escapeUserName','$escapeHashedPass','$escapeSalt','test')"; 

否则,可能无法正确插入特殊字符,您将遇到遇到的问题。


请注意,这些mysql函数已被弃用,您应该使用mysqli或PDO。如果你这样做,并使用参数化查询,这将永远不会发生,因为他们为你处理转义。这本质上使它们更安全。在习惯旧功能之前,您应该考虑使用新功能。

答案 1 :(得分:0)

从你的代码我看到你使用河豚哈希。

当使用河豚散列时,你的盐需要base64编码和 之后你必须用点替换'+'。

你的盐应该长22个字符。

另外,最佳做法是使用PHP散列包,例如http://www.openwall.com/phpass/

很少有人可以编写正确的散列函数。 它需要非常先进和专业的知识。