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

时间: 2024-08-14 02:13:00

Yii 2 —— 密码加密算法的相关文章

腾讯webqq最新密码加密算法,hash算法

经常在做webqq机器人,但是最头痛的问题就是腾讯经常加一些验证串来防止robot,现在共享出最新的腾讯密码加密算法和hash 算法 hash算法 def webqq_hash(i, a): if isinstance(i, (str, unicode)): i = int(i) class b: def __init__(self, _b, i): self.s = _b or 0 self.e = i or 0 r = [i >> 24 & 255, i >> 16 &

MD5 密码加密算法 系统等待

MD5 密码加密算法 1 public static String md(String md, String pass) { 2 MessageDigest m; 3 String passok = ""; 4 try { 5 m = MessageDigest.getInstance(md); 6 m.update(pass.getBytes()); 7 for (byte b : m.digest()) { 8 passok += String.format("%x&qu

7-30 jmu-python-凯撒密码加密算法 (10 分)

编写一个凯撒密码加密程序,接收用户输入的文本和密钥k,对明文中的字母a-z和字母A-Z替换为其后第k个字母. 输入格式: 接收两行输入,第一行为待加密的明文,第二行为密钥k. 输出格式: 输出加密后的密文. 输入样例: 在这里给出一组输入.例如: Hello World! 3 输出样例: 在这里给出相应的输出.例如: Khoor Zruog! s1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r'

重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

一.平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的. AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的实体.数据模型设

洛谷 P1079 Vigenère 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

给某单位的远程接入动态密码认证 建设方案

目         录 一.       远程接入身份认证应用概述.... 3 2.1         远程接入身份认证应用现状... 3 2.2         双因素认证方案建设意见... 3 2.3         认证双因素基本原理... 5 二.       身份认证解决方案.... 5 3.1         动联身份认证系统介绍... 6 3.1.1          认证服务... 7 3.1.2          管理中心... 9 3.1.3          动码令. 12

NOIP201205Vigenère密码

                               NOIP201205Vigenère密码 [问题描述]   16 世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用.   在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用C 表示:而密钥是一种参数, 是将明文转换为密文或将密文转换为明文的算法中输入的数据,

【模拟】1.Vigenère 密码

题目描述 Description 16 世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用C 表示:而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k. 在Vigenère密码中, 密钥k是一个字母串, k=k1k2…kn.当明文M=m1

noip2011 Vigenère 密码

P1079 Vigenère 密码 677通过 1.3K提交 题目提供者洛谷OnlineJudge 标签字符串模拟2012NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而