PHP 使用 password_hash() 给密码加密

PHP >= 5.5 时,可以使用 password_hash() 和 password_verify() 来对用户的密码进行加密和验证,例如在用户注册(加密存储)和登陆(验证):

<?php

$password = '12345';
$options = [
'cost' => 11, // 默认是10,用来指明算法递归的层数
// mcrypt_create_iv — 从随机源创建初始向量
// @param 初始向量大小
// @param 初始向量数据来源
// 可选值有: MCRYPT_RAND (系统随机数生成器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和 MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值为 MCRYPT_DEV_RANDOM。
// 生成一个长度为22的随机向量
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
]; // @param 用户的密码
// @param 一个用来在散列密码时指示算法的密码算法常量
// PASSWORD_DEFAULT 使用 bcrypt 算法 (PHP 5.5.0 默认),该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)
// PASSWORD_BCRYPT 使用 CRYPT_BLOWFISH 算法创建哈希。 这会产生兼容使用 "$2y$" 的 crypt()。 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE
// @param 一个包含有选项的关联数组。目前支持两个选项:salt,在散列密码时加的盐(干扰字符串),以及cost,用来指明算法递归的层数。省略后,将使用随机盐值与默认 cost。
$crypt = password_hash($password, PASSWORD_DEFAULT, $options);
// 或 $crypt = password_hash($password, PASSWORD_DEFAULT);
var_dump($crypt); // 长度60 var_dump(md5($password)); // 长度32 // 检查密码与散列值是否匹配
if(password_verify($password, $crypt)) {
echo 'same';
}

说明:password_hash() 详情见手册:http://php.net/manual/zh/function.password-hash.php,它是 crypt() (见手册:http://php.net/manual/zh/function.crypt.php)的一个简单封装。  

参考:

<PHP Cookbook>3'rd

上一篇:SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码


下一篇:用ElasticSearch搭建自己的搜索和分析引擎