PHP 于昨天发布并带来了一份完整的全新特性与函数的列表全新API之一就是Password Hashing API它包含个函数password_get_info() password_hash()password_needs_rehash()和password_verify()让我们分步来了解每个函数
我们首先讨论password_hash()函数这将用作创建一个新的密码的哈希值它包含三个参数密码哈希算法选项前两项为必须的你可以根据下面的例子来使用这个函数
$password = ;foo;;
$hash = password_hash($passwordPASSWORD_BCRYPT);
//$y$$uOegXJqznQsKvPfxruWjpJBxVDHKGJQVnodzjnglhsWTwHu
你将注意到我们并没有给这个哈希加任何选项现在可用的选项被限定为两个 cost 和salt妖添加选项你需要创建一个关联数组
$options = [ ;cost; =>
;salt; => mcrypt_create_iv( MCRYPT_DEV_URANDOM) ];
将选项添加到 password_hash() 函数后我们的哈希值变了这样更加安全
$hash = password_hash($passwordPASSWORD_BCRYPT$options);
//$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo
现在哈希创建完毕了我们可以通过 password_get_info() 查看新建哈希值得相关信息 password_get_info() 需要一个参数——哈希值——并返回一个包含算法(所用哈希算法的整数代表形式)算法名(所用哈希算法的可读名称)以及选项(我们用于创建哈希值得选项)的关联数组
var_dump(password_get_info($hash));
/*
array() {
["algo"]=>
int()
["algoName"]=>
string() "bcrypt"
["options"]=>
array() {
["cost"]=>
int()
}
}
*/
先一个被添加到 Password Hashing API 的是 password_needs_rehash()它接受三个参数hashhash 算法以及选项前两个是必填项 password_needs_rehash()用来检查一个hash值是否是使用特定算法及选项创建的这在你的数据库受损需要调整hash时非常有用通过利用 password_needs_rehash() 检查每个hash值我们可以看到已存的hash 值是否匹配新的参数 仅影响那些使用旧参数创建的值
最后我们已经创建了我们的hash值查阅了它如何被创建查阅了它是否需要被重新hash现在我们需要验证它要验证纯文本到其hash值我们必须使用 password_verify()它需要两个参数密码及hash值并将返回 TRUE 或 FALSE让我们检查一次我们获得的 hashed 看看是否正确
$authenticate = password_verify(;foo;;$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo;);
//TRUE
$authenticate = password_verify(;bar;;$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo;);
//FALSE
通过以上知识你可以在新的 PHP 版本中迅速且安全的创建 hash 密码了