Yii2——密码加密算法-创新互联

1.1  密码加密算法

参考文档:

创新互联总部坐落于成都市区,致力网站建设服务有成都网站制作、成都网站设计、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!

1、更新后的 PHP: 现代 PHP 中的密码安全性;

2、http://php.net/manual/zh/function.password-hash.php

3、http://php.net/manual/zh/function.password-verify.php

1.1.1  user表结构

Yii 2默认用user表保存账号信息,包括用户的密码,user表结构如下:

id


username

账号

auth_key


password_hash

保存密码的hash值

password_reset_token

忘记密码,重置密码用的token

email


status


created_at


updated_at


1.1.2  核心知识点

1.1.2.1加密

PHP 5.5以后,提供了新的密码加密函数password_hash(),这个加密函数有三个参数,第一个参数就是待加密的密码,第二个参数是加密算法,推荐使用PASSWORD_DEFAULT,这样可以随着PHP的升级,自动选用新的升级算法,第三个参数是加密算法执行次数,一般来说次数越多,密码强度越大,但是花费的时间越多。

1.1.2.2校验

使用password_hash()加密时,每调用一次就会使用新的solt,所以即使是同样的密码,每次调用password_hash()的结果都是不一样的。

一般传统的MD5类方式加密密码时,判断输入的密码是否正确,就是重新用加密算法把密码再加密一次,然后判断加密的结果与数据库中保存的是否一致。现在使用这样的方式来校验密码自然是不行的了(注:ecshop和ectouch就是用这种方法存密码的)。

PHP提供了password_verify()函数用来校验密码是否正确,这个函数有两个参数,第一个是用户输入的密码,第二个参数是事先保存的密码hash值。既然每次调用password_hash()的返回值都不一样,那password_verify()又是怎么确认密码是正确的呢?

根据PHP官网对于该函数的说明:

“注意 password_hash() 返回的哈希包含了算法、 cost 和盐值。 因此,所有需要的信息都包含内。使得验证函数不需要储存额外盐值等信息即可验证哈希。”

1.1.3  Yii 2的封装

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()
 {
    return[
         'log' => ['class' => 'yii\log\Dispatcher'],
         'view' => ['class' => 'yii\web\View'],
         'formatter' => ['class' => 'yii\i18n\Formatter'],
         'i18n' => ['class' => 'yii\i18n\I18N'],
         'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
         'urlManager' => ['class' => 'yii\web\UrlManager'],
         'assetManager' => ['class' => 'yii\web\AssetManager'],
         'security' => ['class' => 'yii\base\Security'],
     ];
 }

1.1.4  题外话 —— 时序***

看Security类的代码发现,其有一个compareString()函数,从功能上分析,它就是比较两个字符串是否相等,但是为什么不直接使用“==”来比较呢?看这个函数的说明:“Performs string comparison using timing attack resistant approach”。

这里的“timing attack”(时序***)引起了我的兴趣,于是了解了一下,原来是有些破解算法是根据目标系统的运行时间,来推测出加密算法的一些信息,从而降低破解难度,提高破解速度,真的是很有意思的一种破解思路。

参考文献:

如何通俗地解释时序***(timingattack)?

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


网页名称:Yii2——密码加密算法-创新互联
当前路径:http://pwwzsj.com/article/ipsgd.html