前言:
在 PHP 开发过程中,很多人 PHP 密码加密都是用的 md5 和 sha1(包括 sha256.......),但不知道,随着技术进步和计算机硬件的提升(集群、分布式、云计算),破解者可以快速使用 "暴力"(彩虹表)方式来寻找密码加密后散列码所对应的原始数据。
最安全的 PHP 密码加密方法:
PHP 官方自带的密码哈希函数 password_hash()
常用的 MD5、SHA1、SHA256 哈希算法,是面向快速、高效进行哈希处理而设计的。随着技术进步和计算机硬件的提升,如今强大的计算机很容易破解这种算法。也就是说,不要用 MD5、SHA1、SHA256 这种哈希方法加密密码了,不太安全。
还好,PHP 内置了密码哈希函数 password_hash,使用这个方法,PHP 会升级底层的算法,达到如今的安全标准水平。
注意:PHP 5.5 之后引入 Password hashing API 用于创建和校验哈希密码,它属于内核自带,无需进行任何扩展安装和配置。
函数具体怎么用?我就不多说了,请大家自行查手册,我简单给大家解释一下:为什么建议大家用 password_hash () 函数?
1、password_hash()
会随机生成 "盐" 。
2、password_hash()
加密后的值包括了 "随机盐"+"密码散列" 组合的值。当然生成这个值是通过了一定算法的,不要问为什么?
3、数据库只需要一个字段就可以存取 "随机盐"+"密码散列" 值。我以前开发项目,为了保证不同用户用不同的盐,我数据库还用了两个字段,一个存密码散列值,另一个存盐的值。
4、密码验证简单,只需要用 password_verify()
函数验证即可!
第一步:password_hash () 加密
用法示例:(推荐)
copy
-
<?php
-
/**
-
* 我们想要使用默认算法散列密码
-
* 当前是 BCRYPT 算法,并会产生 60 个字符的结果。
-
* 据说bcrypt算法永不过时。
-
*
-
* 请注意,随时间推移,默认算法可能会有变化,
-
* 所以需要储存的空间能够超过 60 字(255字不错)
-
*/
-
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
-
?>
以上例程的输出类似于:
copy
-
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
第二步:加密后的散列值存数据库。
这样我们可以直接把上面加密后的值存入数据库,只需要一个字段。
第三步:password_verify()
验证密码是否和散列值匹配?
用法示例:
copy
-
<?php
-
// 想知道以下字符从哪里来,可参见 password_hash() 的例子
-
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
-
if (password_verify('rasmuslerdorf', $hash)) {
-
echo '密码正确';
-
} else {
-
echo '密码错误';
-
}
-
?>
更多相关密码散列算法函数:
copy
-
password_algos --- 获取可用的密码哈希算法ID
-
password_get_info --- 返回指定散列(hash)的相关信息
-
password_hash --- 创建密码的散列(hash)
-
password_needs_rehash --- 检测散列值是否匹配指定的选项
-
password_verify --- 验证密码是否和散列值匹配
请参考 PHP 官方手册:https://www.php.net/manual/zh/ref.password.php
总结:
可能很多人不知道,password_hash()
这个函数,它的前身其实就是 phpass,phpass 是一个开源类库,它可以让我们更方便使用 bcrypt 加密算法。