2

我有一个允许用户插入密码的注册页面,所以我需要对其进行哈希处理以在数据库中变得更加安全,这工作正常

但是在登录时输入的密码与注册密码不匹配如何解决这个问题mm

这是我第一次使用哈希,所以它没有按我的意愿工作

这是哈希的注册码:

   //ADD MD5 hash to the password 
function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass1);      
echo $hashedpass;

哈希密码 = $2y$09$test$5I9x8HWhA4UHi5TMu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e

这是哈希的登录代码:

   function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass);   
echo $hashedpass;

哈希密码 = $2y$09$test$4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e

4

2 回答 2

1

注册后,您将创建一个独特的盐。该盐现在是哈希的一部分。如果您仔细观察,您会发现它嵌入在哈希的第一部分中。要检查密码,请使用之前散列密码的盐,因此您再次使用相同的盐。

$correctPasswordHash = getPasswordFromDatabase($_POST['username']);
$hash = crypt($_POST['password'], $correctPasswordHash);

if ($correctPasswordHash === $hash) ...

为了使这更容易和更简单,请使用password_compat 库,它将其包装在一个易于使用的 API 中,该 API 也将集成到 PHP 的未来版本中。检查其源代码是否正确使用crypt,因为您需要注意一些陷阱。password_compat 库也使用自定义二进制比较,而不是简单===地阻止定时攻击。

于 2013-05-19T06:40:29.680 回答
0

如果我正确理解了您的代码,则登录时间代码会生成新盐,而忽略与密码一起存储的盐。使用不同的盐对相同的密码进行哈希处理会产生不同的哈希值。

根据@c2的回答,要么使用恒定的盐 胡椒(滚动到此答案的底部)

function cryptPass($input, $rounds = 9)
{
  return crypt($input, sprintf('$2y$%02d$mysalt$', $rounds));
}
$hash = cryptPass($pass);   

或者两次使用相同的盐:

// Login time (register-time code is unchanged)
function cryptPass($input, $salt, $rounds = 9)
{
  return crypt($input, sprintf('$2y$%02d$%s$', $rounds, $salt));
}
function checkPass($freshPass, $hashFromDatabase) {
  $salt = explode('$', $hashfromDatabase, 5);
  $salt = $salt[3];
  return cryptPass($freshPass, $salt) === $hashFromDatabase;
}
于 2013-05-19T06:19:58.580 回答