验证密码是否已哈希

时间:2018-03-15 12:24:07

标签: php passwords

为了让它变得非常简单,假设我有一个存储密码的应用程序(无论在哪里)。

php运行:
$hash = password_hash($user_input, PASSWORD_DEFAULT);当用户修改密码,然后存储$hash
$Access = password_verify($user_input, $hash)当用户尝试登录时。

我想确定并检查存储的密码是否实际经过哈希处理 在某些特殊情况下,可能会由某人手动选择和编写密码。因此,我希望php能够知道密码何时没有哈希,并将其哈希以便以安全的形式存储回来。
类似的东西:

if (!is_hashed($hash)) {
    // Hash the password
    password_hash($hash, PASSWORD_DEFAULT);
}

是否有一种简单的方法可以检查字符串是密码的哈希值还是常规字符串?

3 个答案:

答案 0 :(得分:0)

password_hash如果成功则返回散列密码,如果失败则返回false。

if(!password_hash($password)) {
  // do stuff
}

答案 1 :(得分:0)

  

php运行:

     
      
  • password_hash($user_input);当用户修改密码并存储时,
  •   当用户尝试登录时,
  • $Access = password_verify($user_input, $hash)
  •   

此时,未保存为哈希值但未保密密码的密码将无法通过验证,因为只有在哈希输入与保存的数据匹配时才会授予访问权限,应该/必须是哈希。

至于识别某件事是否有,正如我评论的那样,两者都只是一些字符串。除了一些随机密码之外,你不能告诉哈希。但是哈希具有非常特定的长度,因此你可以找到非散列密码。

答案 2 :(得分:0)

您可以使用函数password_get_info()获取有关散列密码的信息。它将始终返回如下数组:

[
    'algo' => int,
    'algoName' => 'name of algorithm|unknown',
    'options' => [/*options for algo, or empty if unknown */]
]

如果你的哈希没有真正散列,函数将返回unknown case数组,如下所示:

[
    'algo' => 0,
    'algoName' => 'unknown',
    'options' => []
]

您可以检查算法是否未知,然后哈希:

$hashInfo = password_get_info($hash);

if ($hashInfo['algoName'] === 'unknown') {
    $hash = password_hash($hash, PASSWORD_DEFAULT);
    //Save new hash to DB
}