$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