Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用相同的salt、密码和blowfish返回不同结果的crypt函数_Php_Mysql_Login_Blowfish_Crypt - Fatal编程技术网

Php 使用相同的salt、密码和blowfish返回不同结果的crypt函数

Php 使用相同的salt、密码和blowfish返回不同结果的crypt函数,php,mysql,login,blowfish,crypt,Php,Mysql,Login,Blowfish,Crypt,我已经开始制作一个登录系统,并使用crypt函数对密码进行编码。我的问题是,当我向那里的用户和密码注册该用户时,它会全部工作,并将用户名密码和salt保存到数据库中。 以下是注册代码: 注:目前这只是一个测试注册页面 $username=$_POST["username"]; $password=$_POST["password"]; $salt = substr(md5(microtime()),rand(0,26),15); $hashedPass = crypt($password,'

我已经开始制作一个登录系统,并使用crypt函数对密码进行编码。我的问题是,当我向那里的用户和密码注册该用户时,它会全部工作,并将用户名密码和salt保存到数据库中。 以下是注册代码:

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

$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

当我登录时,虽然我从数据库中取出salt并尝试以相同的方式重新加密,但我得到了一个不同的加密密码。。。salt是正确的,密码的第一部分也是正确的,因此这部分“$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,仅用于登录和注册页面上的测试,但我仍然有相同的错误

当您将值放入数据库时,请确保将其转义

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

< P>从你的代码中,我看到你使用BooFISH散列。 当使用河豚散列时,您的盐需要base64编码和 之后,您必须用点替换“+”

你的盐应该有22个字符长

此外,最佳实践是使用PHP哈希包,如下面的一个

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