PHP 非对称加密函数password_hash, 替代Md5

$hashed_password = password_hash('mypassword',PASSWORD_BCRYPT);
var_dump(password_verify ('mypassword', $hashed_password.''));
#结果true

我们一般习惯性的使用MD5方法进行用户密码的加密处理,但是常见的Md5方法非常容易被一些大型解密网站破解;

PHP提供了 'password_hash()' 函数可以生产更加安全的密码;

password_hash一共支持三个参数的传入

password_hash ( string $password , int $algo [, array $options ] )

1:用户的明文密码;

2:加密算法 (PASSWORD_DEFAULT PASSWORD_BCRYPT PASSWORD_ARGON2I);

PASSWORD_BCRYPT 支持的选项:

 1. salt(string) - 手动提供散列密码的盐值(salt)。这将避免自动生成盐值(salt)。
      省略此值后,password_hash() 会为每个密码散列自动生成随机的盐值。这种操作是有意的模式。
      盐值(salt)选项从 PHP 7.0.0 开始被废弃(deprecated)了。 现在最好选择简单的使用默认产生的盐值。
2. cost (integer) - 代表算法使用的 cost。 省略时,默认值是 10。 这个 cost 是个不错的底线,但也许可以根据自己硬件的情况,加大这个值

PASSWORD_ARGON2I 支持的选项:

    memory_cost (integer) - 计算 Argon2 散列时的最大内存(单位:字节 byte)。默认值: PASSWORD_ARGON2_DEFAULT_MEMORY_COST。
    time_cost (integer) - 计算 Argon2 散列时最多的时间。默认值: PASSWORD_ARGON2_DEFAULT_TIME_COST。
    threads (integer) - 计算 Argon2 散列时最多的线程数。默认值: PASSWORD_ARGON2_DEFAULT_THREADS。

3.一个包含有选项的关联数组 目前支持两个选项:salt (盐值) cost(用来指明算法递归的层数);

返回值:
返回散列后的密码,失败的时候返回False;
其中返回的密码中包含了使用的(算法 cost 盐值) 所以我们可以不用存储盐值和算法的信息;
使用password_verify()可以直接进行验证;

使用案例:

$options = [
  'cost' => 11,
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
 ];
password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
输出:$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.

验证散列是否和密码匹配 password_verify()

bool password_verify ( string $password , string $hash )

参数1:传入用户密码 参数2:传入用户的哈希值

案例:

$hashed_password = password_hash('mypassword',PASSWORD_BCRYPT);
var_dump(password_verify ('mypassword', $hashed_password.''));

PHP官网解释:http://php.net/manual/zh/faq.passwords.php

      http://php.net/manual/zh/function.password-hash.php