php – 使用crypt()和password_hash()函数加密后密码不匹配

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 使用crypt()和password_hash()函数加密后密码不匹配脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
修改了我的旧帖子.我尝试了crypt()函数,现在尝试使用password_hash()和password_verify()来验证来自数据库的加密密码,但是在每次调用时,password_hash()函数都会调用不同的加密字符串,而password_verify()不能匹配.

这就是我这样做.

//please ignore the Syntax error if any

$data = '11';
$dbpass = password_hash($data,PASSWORD_BCRYPT);
echo $dbpass;  // displays the random strings on each page refresh.

一旦密码保存到数据库中,登录过程中就不会匹配.下面是我的实际功能.

PRivate function process_data($password){
    $password = __STR.$password.__STR;
    return  password_hash($password,PASSWORD_BCRYPT);

  }
  private function processed($login_password,$dbpassword){
    $LOGin_password = __STR.$login_password.__STR;
    return password_verify($login_password,$dbpassword);
  }

在每个函数调用创建一个用于密码的散列字符串时,该函数将在下一次返回不同的字符串.

好的,我们一个一个地去看看.

首先,它是散列,而不是加密.加密是双向的,散列是一种方式.我们要哈希.我们从不想加密.是的,语很重要.请使用正确的术语.

接下来,每次调用password_hash应该返回一个不同的哈希.那是因为它产生了强大的随机盐.这是它的设计方式,以及你如何真正使用它.

此外,请勿在密码前后添加__STR中的“胡椒”.你什么都不做,但可能会削弱用户的密码(这不是很好).如果你想要更多的信息,为什么这是一个坏主意:Read This Answer.

继续,我强烈建议您不要直接使用crypt.实际上令人惊讶的是容易产生非常弱的哈希值.这就是为什么password_ * api的设计. crypt是一个低级别的库,你想在代码中使用一个高级库.有关如何解决bcrypt的更多信息,请查看我的博客Seven Ways To Screw Up Bcrypt.

密码API被设计为一个简单的一站式服务.如果它不适用于您,请检查以下事项

你使用PHP> = 5.5.0?或者是否使用PHP> = 5.3.7与password_compat

>您的数据库列是否足够

它需要至少60个字符.
>你是否检查该函数的结果是一个字符串,而不是bool(false)?

如果有内部错误,它将从password_hash返回一个非字符串.
>你有任何错误吗?

您是否将error_reporting设置为最大设置(我建议使用-1来捕获所有内容),并检查代码是否没有发生任何错误
您确定正确使用它吗?

function saveUser($username,$password) {
    $hash = password_hash($password,PASSWORD_BCRYPT);
    // save $username and $hash to db
}
function login($username,$password) {
    // fetch $hash From db
    return password_verify($password,$hash);
}

请注意,每个应该只调用一次.

你正在使用PHP< 5.3.7与password_compat?如果是这样,这是你的问题.您正在使用不支持PHP版本的兼容性库.您可以使其正常工作(某些redhat发行版已经反映了必要的修复),但是您使用的是不受支持的版本.请升级到合理的版本.

如果其他所有失败,请尝试运行此代码并报告输出

$hash = '$2y$04$usesomesillystringfore7hnbrJHxXVLeakoG8K30oukPsA.ztMG';
$test = crypt("password",$hash);
$pass = $test == $hash;

echo "Test for functionalITy of compat library: " . ($pass ? "Pass" : "Fail");
echo "\n";

如果返回失败,则运行不受支持PHP版本,并应升级.如果它返回通过,比错误在你的逻辑(图书馆运行正常)的某个地方.

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用crypt()和password_hash()函数加密后密码不匹配全部内容,希望文章能够帮你解决php – 使用crypt()和password_hash()函数加密后密码不匹配所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。