PHP 实战用户密码加密函数password_hash和验证函数password_verify

2019-7-20 一诺 php

传统的用户名和密码都采用加盐的方式存储加密信息,盐值也需要存储。

自PHP5.5.0之后,新增加了密码散列算法函数password_hash(加密)和password_verify(验证)
password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)
password_hash() 兼容 crypt()
所以, crypt() 创建的密码散列也可用于 password_hash()

password_hash接收两个必需参数(明文密码和加密算法),一个可选的数组,返回一个字符串
password_verify接收两个必需参数(明文密码和加密后的密码),返回Bool

password_hash不需要再单独存储盐值,而且每次加密的值都不一样
我们只需要存储加密字符串,验证时用password_verify()方法即可得出结果!

当前支持的加密算法:

PASSWORD_DEFAULT - 使用 bcrypt 算法 (PHP 5.5.0 默认)。 
注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 
所以,使用此常量生成结果的长度将在未来有变化。 
因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。

PASSWORD_BCRYPT - 使用 CRYPT_BLOWFISH 算法创建散列。 
这会产生兼容使用 "$2y$" 的 crypt()。
结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE。

PASSWORD_ARGON2I - 使用 Argon2 散列算法创建散列。

返回值:

返回散列后的密码, 或者在失败时返回 FALSE。

使用的算法、cost 和盐值作为散列的一部分返回。
所以验证散列值的所有信息都已经包含在内。 
这使 password_verify() 函数验证的时候,不需要额外储存盐值或者算法的信息。

加密:
<?php
/**
 * 我们想要使用默认算法散列密码
 * 当前是 BCRYPT,并会产生 60 个字符的结果。
 *
 * 请注意,随时间推移,默认算法可能会有变化,
 * 所以需要储存的空间能够超过 60 字(255字不错)
 * 注册为例子
 */
    $password = password_hash($password, PASSWORD_DEFAULT);
 // sql语句存储$password
?>
数据库存储的密码类似这种:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1FJDJdfdfsdfddDFAd

验证:
<?php
/**
 * 登录为例子
 */
  $link=connect(); // 连接数据库方法
 $username = 'zhangsan';
 $password = '123456'; //用户输入的密码
  $sql = "select username,password from userinfo where username = '$username'";
   $result=mysqli_query($link,$sql);
   $data = mysqli_fetch_object($result);
   if ($data) {
     if(password_verify($password, $data->password)) {
      // 密码正确
     }else{
      // 密码错误
     }
  }else{
   // 用户不存在
  }
?>


标签: php

分享这篇文章
赞助鼓励:如果觉得内容对您有所帮助,您可以支付宝(左)或微信(右):

声明:如无特殊注明,所有博客文章版权皆属于作者,转载使用时请注明出处。谢谢!

发表评论:

皖ICP备15010162号-1 @2015 勿恨水长东
qq:1614245331 邮箱:13515678147@163.com Powered by emlog