yii2的加密解密那些事儿
我们做程序的时候,加密解密是绕不开的话题,使用yii2开发应用的时候,都内置了哪些有关加密解密(安全)方便的支持那?本文将为你揭晓。
相关环境
- 操作系统及IDE macOS 10.13.1 & PhpStorm2018.1.2
- 软件版本 PHP7.1.8 Yii2.0.14
在yii2中,管理加密解密的库叫做Security,它以yii2组件的形式存在,因此你可以通过Yii::$app->security来获取并使用它。
Security组件源代码位置如下
vendor/yiisoft/yii2/base/Security.php
Security组件一共有15个与加密解密(&编码)相关的公共方法,我们先来列一个清单。
- encryptByPassword
- encryptByKey
- decryptByPassword
- decryptByKey
- hkdf
- pbkdf2
- hashData
- validateData
- generateRandomKey
- generateRandomString
- generatePasswordHash
- validatePassword
- compareString
- maskToken
- unmaskToken
我想有一些你一定没见过,没关系,我们一一去了解。
generateRandomString
之所以先说generateRandomString是因为它最常用,起码我是这样。
public function generateRandomString($length = 32){...}
生成一个随机的字符串,参数$length代表这个字符串的长度,默认32位。值得说明的是这个字符串的取值为范围是[A-Za-z0-9_-]。
generatePasswordHash & validatePassword
generatePasswordHash & validatePassword经常被用来加密用户密码以及对密码是否正确的验证,自从MD5可能被碰撞后,我们用yii2开发应用的时候,generatePasswordHash函数对密码进行加密就成为首选了,它调用了crypt函数。
一般用法如下
// 使用generatePasswordHash为用户的密码加密,$hash存储到库中
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);// 使用validatePassword对密码进行验证
if(Yii::$app->getSecurity()->validatePassword($password, $hash)){// 密码正确
}else{// 密码错误
}
generateRandomKey
和generateRandomString类似,生成一个随机的串,参数为长度,默认为32位,区别在于generateRandomKey生成的不是ASCII。
简单的说 generateRandomString 约等于 base64_encode(generateRandomKey)。
encryptByPassword & decryptByPassword
编码和解码函数,使用一个秘钥对数据进行编码,然后通过此秘钥在对编码后的数据进行解码。
例子
$dat = Yii::$app->security->encryptByPassword("hello","3166886");echo Yii::$app->security->encryptByPassword($dat,"3166886");// hello
要注意,通过上面得到的编码后的数据不是ASCII,可以通过base64_encode和base64_decode在外层包装下。
encryptByKey & decryptByKey
同样是一组编码和解码函数,比通过密码的方式要快。函数声明为
public function encryptByKey($data, $inputKey, $info = null){}public function decryptByKey($data, $inputKey, $info = null){}
encryptByKey & decryptByKey 存在着第三个参数,比如我们可以传递会员的ID等,这样此信息将和$inputKey一起作为加密解密的钥匙。
hkdf
使用标准的 HKDF 算法从给定的输入键中导出一个键。在PHP7+使用的是hash_hkdf方法,小于PHP7使用hash_hmac方法。
pbkdf2
使用标准的 PBKDF2 算法从给定的密码导出一个密钥。该方法可以用来进行密码加密,不过yii2有更好的密码加密方案 generatePasswordHash。
hashData和validateData
有的时候为了防止内容被篡改,我们需要对数据进行一些标记,hashData和validateData就是完成这个任务的组合。
hashData 用来对原始数据进行加数据前缀,比如如下代码
$result = Yii::$app->security->hashData("hello",'123456',false);// ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello
你看到了在hello的前面多了一组字符,这组字符会随着原始数据的不同而变化。这样我们就对数据进行了特殊的防止篡改标记,接下来是validateData上场了。
注意:hashData的第三个参数代表生成的哈希值是否为原始二进制格式. 如果为false
, 则会生成小写十六进制数字.
validateData 对已经加了数据前缀的数据进行检测,如下代码
$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",'123456',false);// hello
如果返回了原始的字符串则表示验证通过,否则会返回假。
validateData 函数的第三个参数应该与使用 hashData() 生成数据时的值相同. 它指示数据中的散列值是否是二进制格式. 如果为false
, 则表示散列值仅由小写十六进制数字组成. 将生成十六进制数字.
compareString
可防止时序攻击的字符串比较,用法非常简单。
Yii::$app->security->compareString("abc",'abc');
结果为真则相等,否则不相等。
那么什么是时序攻击那?我来举一个简单的例子。
if($code == Yii::$app->request->get('code')){}
上面的比较逻辑,两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。
而使用 compareString 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。
maskToken && unmaskToken
maskToken用于掩盖真实token且不可以压缩,同一个token最后生成了不同的随机令牌,在yii2的csrf功能上就使用了maskToken,原理并不复杂,我们看下源码。
public function maskToken($token){$mask = $this->generateRandomKey(StringHelper::byteLength($token));return StringHelper::base64UrlEncode($mask . ($mask ^ $token));
}
而unmaskToken目的也很明确,用于得到被maskToken掩盖的token。
接下来我们看一个例子代码
$token = Yii::$app->security->maskToken("123456");echo Yii::$app->security->unmaskToken($token);// 结果为 123456
最后我们总结下
- 加密/解密: encryptByKey()、decryptByKey()、 encryptByPassword() 和 decryptByPassword();
- 使用标准算法的密钥推导: pbkdf2() 和 hkdf();
- 防止数据篡改: hashData() 和 validateData();
- 密码验证: generatePasswordHash() 和 validatePassword()
http://www.taodudu.cc/news/show-3389159.html
相关文章:
- Python学习1
- 2021年9月广州羊城杯,REVERSE的RE-BabySmc
- 我们为什么解决不了大问题?
- 谷歌如何成功整合创业公司
- 网络概念股IPO狂潮再现dot-com黄金时代?
- 阿里巴巴盘中市值达4700亿美元;B站计划最快明年美国IPO ;NASA计划为前往火星宇航员修改DNA丨价值早报
- 互联网晚报 | 11月5日 星期五 | 中国移动A股IPO成功过会;腾讯会议用户数近2亿;荣耀智能制造产业园首次亮相...
- 你不知道的秘密——谷歌和布林佩奇的故事
- 投中谷歌、亚马逊、推特、Facebook,公认的“互联网风投之王”是如何养成的?
- 区块链是回归互联网本来意义的唯一希望
- SpaceX星舰原型机高空测试爆炸,Airbnb上市成就2020最大IPO|前沿科技周报
- 第九周AI十大要闻 | 中国AI企业数达千家,科创板IPO年营收最低5亿
- 关于Keyhole和Google Maps(二)
- 创始人成全球首富,亚马逊究竟是一家什么公司?
- 创业的目的是什么?无非是IPO或者被收购
- 以色列欲当下一个世界网络安全中心
- 以色列简介
- 以色列创新加速项目启动,将科技创新企业引入中国
- 孙亚芳-探索以色列崛起之迹
- 华为任正非强烈推荐的一篇爆文:以色列崛起之谜!
- 索尼收购以色列半导体公司 推动物联网业务发展
- 以色列网络安全行业的繁荣还将持续向前
- 以色列,为什么成为了医疗器械的创新大国?
- 以色列:金融服务公司GMT加入RippleNet
- 严重人才短缺致以色列科技产业发展遭遇瓶颈
- ICT 2017 | 以色列驻华大使馆商务官欧美雅: 以色列人一直都在追求创新
- 以色列央行公开征集DLT相关信息
- 创业圣地以色列:一个逆天到爆表国家的发展推演
- 读书笔记——魔鬼经济学
- 以色列发布ICO税收草案
yii2的加密解密那些事儿相关推荐
- Yii2 security 加密解密库
编码和解码函数,比通过密码的方式要快做程序的时候,加密解密是绕不开的话题,使用yii2开发应用的时候,都内置了哪些有关加密解密(安全)方便的支持,以下做下详细对 security 的说明. 在yii2 ...
- swoolephp加密_6种php加密解密方法
看代码演示: function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted = rtrim(mcrypt_dec ...
- go md5加密解密_PHP 代码加密实践
在我们开发的项目中,有一部分可能是用于商业用途,会部署在客户提供的机器环境中.因为 PHP 本身是解释型语言,所以未进行处理的代码,就会有泄露或被修改的风险.那么我们可能会想到最简单有效的方法就是进行 ...
- 安全篇 ━━ JWT的用途和安全探讨,编码解码=\=加密解密
一.定义 JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred betw ...
- java上传加密_Java上传下载文件并实现加密解密
使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...
- 提供一个基于.NET的加密/解密算法
提供一个基于.NET SymmetricAlgorithm 类的.带私钥的加密/解密算法的包装类.使用方法: symmcrypto de = new SymmCrypto(SymmCrypto.Sym ...
- 加密解密php,PHP实现的加密解密处理类
本文实例讲述了PHP实现的加密解密处理类.分享给大家供大家参考,具体如下: /*=========================================================== ...
- 加密解密-DES算法和RSA算法
昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:) 一.DES算法 这种算法如图所示,这里将描述它的每一个步骤.这个算法进行了16次迭代(圈),把各块明文交织起来与 从密钥中获得 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
最新文章
- 运行在CentOS7.5上的Django项目时间不正确问题
- 南方科技大学宋毅课题组招聘启事
- java中table是什么标签_[Java教程]javascript格式化table标签内容
- FDATOOL设计数字滤波器
- 重磅!百度研究院发布2021年十大科技趋势预测
- Galera集群server.cnf参数调整--前言
- [HTML5]块和内联元素的嵌套
- 2021-09-14基于用 户 行为 序列建模的推荐算法研究
- 文本文件和二进制文件的判别
- 油库蓝牙+北斗RTK人员定位方案解析
- Prometheus+Grafana监控系统部署与使用
- 智能时代“无人区”的开拓者,国防科大智能科学学院推免生源大起底
- 黑苹果 中文四叶草下载
- UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
- “第二课堂”开课啦~
- 《般若波罗蜜多心经》注解
- 墙裂推荐ShapeView二
- Java的来源和基础语法
- 基于MFC的OpenDDS发布订阅例子(PubSubDemo)
- 程序员自由工作平台国内外汇总篇
热门文章
- 借VR产业东风,江西抢滩布局“元宇宙”
- 台式计算机按电源开关无法开机,台式电脑没法启动,按下开机键电源灯闪一下就什么反应都没...
- 计算机模拟仿真试验有哪些案例,成功案例、申报指南……你想知道的虚拟仿真实验教学项目建设这都有...
- Carsim中几个轮胎速度,有关滑移率的设置
- 汽车钣金模具设计规范
- minio-搭建个人云存储服务
- 安装Adobe XD出错
- 【爬虫+MongoDB】《星际穿越》豆瓣影评信息爬取
- 商家私域流量运营价值考核方式,私域流量池的数据评价指标!
- 关于远程桌面进程强制关闭后导致服务崩溃无法连接的修复