Detailed explanation of php Bcrypt password encryption mechanism

怪我咯
Release: 2023-03-12 17:02:01
Original
2396 people have browsed it

这篇文章主要给大家介绍了关于PHP更安全的密码加密机制Bcrypt的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。

前言

我们常常为了避免在服务器受到攻击,数据库被拖库时,用户的明文密码不被泄露,一般会对密码进行单向不可逆加密——哈希。

常见的方式是:

哈希方式 加密密码
md5(‘123456') e10adc3949ba59abbe56e057f20f883e
md5(‘123456' . ($salt = ‘salt')) 207acd61a3c1bd506d7e9a4535359f8a
sha1(‘123456') 40位密文
hash(‘sha256', ‘123456') 64位密文
hash(‘sha512', ‘123456') 128位密文

密文越长,在相同机器上,进行撞库消耗的时间越长,相对越安全。

比较常见的哈希方式是 md5 + 盐,避免用户设置简单密码,被轻松破解。

password_hash

但是,现在要推荐的是password_hash()函数,可以轻松对密码实现加盐加密,而且几乎不能破解。

$password = '123456'; var_dump(password_hash($password, PASSWORD_DEFAULT)); var_dump(password_hash($password, PASSWORD_DEFAULT));
Copy after login

password_hash生成的哈希长度是 PASSWORD_BCRYPT —— 60位,PASSWORD_DEFAULT —— 60位 ~ 255位。PASSWORD_DEFAULT 取值跟 php 版本有关系,会等于其他值,但不影响使用。

每一次password_hash运行结果都不一样,因此需要使用password_verify函数进行验证。

$password = '123456'; $hash = password_hash($password, PASSWORD_DEFAULT); var_dump(password_verify($password, $hash));
Copy after login

password_hash会把计算 hash 的所有参数都存储在 hash 结果中,可以使用password_get_info获取相关信息。

$password = '123456'; $hash = password_hash($password, PASSWORD_DEFAULT); var_dump(password_get_info($hash));
Copy after login

输出

array(3) { ["algo"]=> int(1) ["algoName"]=> string(6) "bcrypt" ["options"]=> array(1) { ["cost"]=> int(10) } }
Copy after login

注意:不包含 salt

可以看出我当前版本的 PHP 使用PASSWORD_DEFAULT实际是使用PASSWORD_BCRYPT

password_hash($password, $algo, $options)的第三个参数$options支持设置至少 22 位的 salt。但仍然强烈推荐使用 PHP 默认生成的 salt,不要主动设置 salt。

当要更新加密算法和加密选项时,可以通过password_needs_rehash判断是否需要重新加密,下面的代码是一段官方示例

$options = array('cost' => 11); // Verify stored hash against plain-text password if (password_verify($password, $hash)) { // Check if a newer hashing algorithm is available // or the cost has changed if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) { // If so, create a new hash, and replace the old one $newHash = password_hash($password, PASSWORD_DEFAULT, $options); } // Log user in }
Copy after login

password_needs_rehash可以理解为比较$algo+$optionpassword_get_info($hash)返回值。

password_hash 运算慢

password_hash是出了名的运行慢,也就意味着在相同时间内,密码重试次数少,泄露风险降低。

$password = '123456'; var_dump(microtime(true)); var_dump(password_hash($password, PASSWORD_DEFAULT)); var_dump(microtime(true)); echo "\n"; var_dump(microtime(true)); var_dump(md5($password)); for ($i = 0; $i < 999; $i++) { md5($password); } var_dump(microtime(true));
Copy after login

输出

float(1495594920.7034) string(60) "$2y$10$9ZLvgzqmiZPEkYiIUchT6eUJqebekOAjFQO8/jW/Q6DMrmWNn0PDm" float(1495594920.7818) float(1495594920.7818) string(32) "e10adc3949ba59abbe56e057f20f883e" float(1495594920.7823)
Copy after login

password_hash运行一次耗时 784 毫秒, md5 运行 1000 次耗时 5 毫秒。这是一个非常粗略的比较,跟运行机器有关,但也可以看出password_hash运行确实非常慢。

The above is the detailed content of Detailed explanation of php Bcrypt password encryption mechanism. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!