【问题标题】:crypt function returning different results with same salt,password and blowfishcrypt 函数使用相同的盐、密码和河豚返回不同的结果
【发布时间】:2012-08-28 23:59:56
【问题描述】:

我已经开始制作一个登录系统并使用 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/Gl1/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";

        }
    }

对于登录页面,盐是正确的,但这是经过哈希处理后的密码: $2y$10$d395985a2ca993f$$$$$$.ccy3PKl.TsG26FWJBFXKmpQ3wtk4AqC

第一部分到句号是正确的,只是后半部分不同

我尝试将盐设置为手动设置,例如 abc 或 123,只是为了测试登录和注册页面,但我仍然遇到同样的错误

【问题讨论】:

    标签: php mysql login blowfish crypt


    【解决方案1】:

    从您的代码中,我看到您使用河豚散列法。

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

    你的盐应该是 22 个字符长。

    此外,最佳实践是使用 PHP 哈希包,例如 http://www.openwall.com/phpass/

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

    【讨论】:

      【解决方案2】:

      当您将值放入数据库时​​,请确保对它们进行转义。

      $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。如果您这样做了,并且使用了参数化查询,那么这将永远不会发生,因为它们会为您处理转义。这本质上使它们更加安全。在习惯旧功能之前,您应该考虑使用新功能。

      【讨论】:

        猜你喜欢
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        • 2012-11-13
        相关资源
        最近更新 更多