Yii 2 —— 密码加密算法-阿里云开发者社区

开发者社区> 余二五> 正文

Yii 2 —— 密码加密算法

简介:
+关注继续查看

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类方式加密密码时,判断输入的密码是否正确,就是重新用加密算法把密码再加密一次,然后判断加密的结果与数据库中保存的是否一致。现在使用这样的方式来校验密码自然是不行的了(注:ecshopectouch就是用这种方法存密码的)。

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 function coreComponents()
 {
     
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)?






本文转自 tywali 51CTO博客,原文链接:http://blog.51cto.com/lancelot/1871635,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10089 0
Base64加密解密算法的C/C++代码实现
这个Base64是从Live555的代码里面提取出来的,请大家放心使用吧。   Base64的加密解密的算法和原理我就不想说了。。。。, 网上有很多介绍原理的文章。
1091 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11631 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13892 0
Spring Security笔记:使用BCrypt算法加密存储登录密码
在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号、密码”存储在db中,但是密码都是明文存储的,显然不太讲究。这一节将学习如何使用spring security3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证。
1627 0
密码学系列之:加密货币中的scrypt算法
为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合。但是这些算法逐渐被一些特制的ASIC处理器打败,这些ASIC处理器不做别的,就是专门来破解你的密码或者进行hash运算。
27 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11893 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载