重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
参考文档:
创新互联总部坐落于成都市区,致力网站建设服务有成都网站制作、成都网站设计、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!1、更新后的 PHP: 现代 PHP 中的密码安全性;
2、http://php.net/manual/zh/function.password-hash.php
3、http://php.net/manual/zh/function.password-verify.php
Yii 2默认用user表保存账号信息,包括用户的密码,user表结构如下:
id | |
username | 账号 |
auth_key | |
password_hash | 保存密码的hash值 |
password_reset_token | 忘记密码,重置密码用的token |
status | |
created_at | |
updated_at |
PHP 5.5以后,提供了新的密码加密函数password_hash(),这个加密函数有三个参数,第一个参数就是待加密的密码,第二个参数是加密算法,推荐使用PASSWORD_DEFAULT,这样可以随着PHP的升级,自动选用新的升级算法,第三个参数是加密算法执行次数,一般来说次数越多,密码强度越大,但是花费的时间越多。
使用password_hash()加密时,每调用一次就会使用新的solt,所以即使是同样的密码,每次调用password_hash()的结果都是不一样的。
一般传统的MD5类方式加密密码时,判断输入的密码是否正确,就是重新用加密算法把密码再加密一次,然后判断加密的结果与数据库中保存的是否一致。现在使用这样的方式来校验密码自然是不行的了(注:ecshop和ectouch就是用这种方法存密码的)。
PHP提供了password_verify()函数用来校验密码是否正确,这个函数有两个参数,第一个是用户输入的密码,第二个参数是事先保存的密码hash值。既然每次调用password_hash()的返回值都不一样,那password_verify()又是怎么确认密码是正确的呢?
根据PHP官网对于该函数的说明:
“注意 password_hash() 返回的哈希包含了算法、 cost 和盐值。 因此,所有需要的信息都包含内。使得验证函数不需要储存额外盐值等信息即可验证哈希。”
Yii 2提供了一个Security类,将上面的密码加密和验证函数封装起来,并且增加了对于低版本PHP的支持。
generatePasswordHash
生成密码的哈希值,调用password_hash()实现。
validatePassword
校验密码是否正确,调用password_verify()实现。
在框架中使用Security类,无需自己初始化,Yii 2框架已经默认创建了Security类的实例,使用如下代码访问即可:
Yii::$app->security->validatePassword($password, $this->password_hash); //或者 Yii::$app->getSecurity()->hashData(serialize([$cookie->name, $value]), $validationKey) |
Security类的初始化?在base\Application.php中的preInit()函数中调用coreComponents()函数获得所配置的security属性对应的类路径:
public functioncoreComponents() |
看Security类的代码发现,其有一个compareString()函数,从功能上分析,它就是比较两个字符串是否相等,但是为什么不直接使用“==”来比较呢?看这个函数的说明:“Performs string comparison using timing attack resistant approach”。
这里的“timing attack”(时序***)引起了我的兴趣,于是了解了一下,原来是有些破解算法是根据目标系统的运行时间,来推测出加密算法的一些信息,从而降低破解难度,提高破解速度,真的是很有意思的一种破解思路。
参考文献:
如何通俗地解释时序***(timingattack)?
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。