全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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));

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 + $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));

输出

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密码加密和解密  # 可以看出  # 的是  # 都不  # 出了  # 也就  # 推荐使用  # 这是一个  # 时间内  # 可以通过  # 但也  # 会对  # 相关信息  # 可以使用  # 会把  # 这篇文章  # 不被  # 第三个  # 谢谢大家  # 但不  # 为了避免 


相关文章: 天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何快速登录WAP自助建站平台?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  c# await 一个已经完成的Task会发生什么  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  制作旅游网站html,怎样注册旅游网站?  建站之星如何快速更换网站模板?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  在线制作视频的网站有哪些,电脑如何制作视频短片?  网站按钮制作软件,如何实现网页中按钮的自动点击?  学校建站服务器如何选型才能满足性能需求?  威客平台建站流程解析:高效搭建教程与设计优化方案  宝塔建站教程:一键部署配置流程与SEO优化实战指南  Android自定义listview布局实现上拉加载下拉刷新功能  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星北京办公室:智能建站系统与小程序生成方案解析  简历在线制作网站免费,免费下载个人简历的网站是哪些?  高防服务器如何保障网站安全无虞?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  建站之星如何防范黑客攻击与数据泄露?  专业公司网站制作公司,用什么语言做企业网站比较好?  手机网站制作与建设方案,手机网站如何建设?  网站制作需要会哪些技术,建立一个网站要花费多少?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  济南专业网站制作公司,济南信息工程学校怎么样?  韩国服务器如何优化跨境访问实现高效连接?  如何快速搭建高效香港服务器网站?  如何通过主机屋免费建站教程十分钟搭建网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  想学网站制作怎么学,建立一个网站要花费多少?  孙琪峥织梦建站教程如何优化数据库安全?  如何在云主机上快速搭建网站?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何选购建站域名与空间?自助平台全解析  高端建站三要素:定制模板、企业官网与响应式设计优化  小程序网站制作需要准备什么资料,如何制作小程序?  如何快速启动建站代理加盟业务?  ,有什么在线背英语单词效率比较高的网站?  在线教育网站制作平台,山西立德教育官网?  如何确保西部建站助手FTP传输的安全性?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  如何制作网站标识牌,动态网站如何制作(教程)?  如何选择域名并搭建高效网站?  c# 服务器GC和工作站GC的区别和设置  建站之星如何开启自定义404页面避免用户流失?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  建站VPS能否同时实现高效与安全翻墙?  历史网站制作软件,华为如何找回被删除的网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。