1

我已经开始着手制作登录系统并使用 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,仅用于登录和注册页面的测试,但我仍然遇到相同的错误

4

2 回答 2

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

于 2012-08-29T02:14:34.677 回答
0

从您的代码中,我看到您使用河豚哈希。

使用河豚散列时,您的盐需要进行 base64 编码,之后您必须将“+”替换为点。

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

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

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

于 2013-04-24T04:21:57.523 回答