前言

我们常常为了避免在服务器受到攻击,数据库被拖库时,用户的明文密码不被泄露,一般会对密码进行单向不可逆加密——哈希。
常见的方式是:
| 哈希方式 | 加密密码 |
| 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));
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));
password_hash 会把计算 hash 的所有参数都存储在 hash 结果中,可以使用 password_get_info 获取相关信息。
$password = '123456'; $hash = password_hash($password, PASSWORD_DEFAULT); var_dump(password_get_info($hash));
输出
array(3) {
["algo"]=>
int(1)
["algoName"]=>
string(6) "bcrypt"
["options"]=>
array(1) {
["cost"]=>
int(10)
}
}
注意:不包含 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
}
password_needs_rehash 可以理解为比较 $algo + $option 和 password_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));
输出
float(1495594920.7034) string(60) "$2y$10$9ZLvgzqmiZPEkYiIUchT6eUJqebekOAjFQO8/jW/Q6DMrmWNn0PDm" float(1495594920.7818) float(1495594920.7818) string(32) "e10adc3949ba59abbe56e057f20f883e" float(1495594920.7823)
password_hash 运行一次耗时 784 毫秒, md5 运行 1000 次耗时 5 毫秒。这是一个非常粗略的比较,跟运行机器有关,但也可以看出 password_hash 运行确实非常慢。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# bcrypt
# 加密
# php
# 解密
# 加密机制
# Java使用bcrypt实现对密码加密效果详解
# SpringBoot整合BCrypt实现密码加密
# Spring security BCryptPasswordEncoder密码验证原理详解
# 使用mongoose和bcrypt实现用户密码加密的示例
# Express下采用bcryptjs进行密码加密的方法
# 密码哈希函数 Bcrypt的最大密码长度限制详解
# 一文掌握SpringSecurity BCrypt密码加密和解密
# 可以看出
# 的是
# 都不
# 出了
# 也就
# 推荐使用
# 这是一个
# 时间内
# 可以通过
# 但也
# 会对
# 相关信息
# 可以使用
# 会把
# 这篇文章
# 不被
# 第三个
# 谢谢大家
# 但不
# 为了避免
相关文章:
如何零基础在云服务器搭建WordPress站点?
网站网页制作专业公司,怎样制作自己的网页?
如何在IIS服务器上快速部署高效网站?
如何快速搭建二级域名独立网站?
如何在七牛云存储上搭建网站并设置自定义域名?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
宁波免费建站如何选择可靠模板与平台?
广州建站公司哪家好?十大优质服务商推荐
北京网站制作网页,网站升级改版需要多久?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何通过VPS建站实现广告与增值服务盈利?
建站之星伪静态规则如何设置?
小程序网站制作需要准备什么资料,如何制作小程序?
建站之星如何实现五合一智能建站与营销推广?
C#怎么创建控制台应用 C# Console App项目创建方法
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
高性价比服务器租赁——企业级配置与24小时运维服务
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站主机类型有哪些?如何正确选型
再谈Python中的字符串与字符编码(推荐)
如何快速搭建虚拟主机网站?新手必看指南
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
官网网站制作腾讯审核要多久,联想路由器newifi官网
5种Android数据存储方式汇总
如何快速查询域名建站关键信息?
,购物网站怎么盈利呢?
如何在服务器上三步完成建站并提升流量?
制作门户网站的参考文献在哪,小说网站怎么建立?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
高端网站建设与定制开发一站式解决方案 中企动力
如何注册花生壳免费域名并搭建个人网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何快速建站并高效导出源代码?
相册网站制作软件,图片上的网址怎么复制?
宝塔建站后网页无法访问如何解决?
建站之星如何配置系统实现高效建站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
详解jQuery停止动画——stop()方法的使用
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何快速搭建高效香港服务器网站?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
昆明高端网站制作公司,昆明公租房申请网上登录入口?
网站制作需要会哪些技术,建立一个网站要花费多少?
如何实现建站之星域名转发设置?
建站之星安装后如何自定义网站颜色与字体?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
*请认真填写需求信息,我们会在24小时内与您取得联系。