我们做程序的时候,加密解密是绕不开的话题,使用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个与加密解密(&编码)相关的公共方法,我们先来列一个清单。

  1. encryptByPassword
  2. encryptByKey
  3. decryptByPassword
  4. decryptByKey
  5. hkdf
  6. pbkdf2
  7. hashData
  8. validateData
  9. generateRandomKey
  10. generateRandomString
  11. generatePasswordHash
  12. validatePassword
  13. compareString
  14. maskToken
  15. 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的加密解密那些事儿相关推荐

  1. Yii2 security 加密解密库

    编码和解码函数,比通过密码的方式要快做程序的时候,加密解密是绕不开的话题,使用yii2开发应用的时候,都内置了哪些有关加密解密(安全)方便的支持,以下做下详细对 security 的说明. 在yii2 ...

  2. swoolephp加密_6种php加密解密方法

    看代码演示: function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted = rtrim(mcrypt_dec ...

  3. go md5加密解密_PHP 代码加密实践

    在我们开发的项目中,有一部分可能是用于商业用途,会部署在客户提供的机器环境中.因为 PHP 本身是解释型语言,所以未进行处理的代码,就会有泄露或被修改的风险.那么我们可能会想到最简单有效的方法就是进行 ...

  4. 安全篇 ━━ JWT的用途和安全探讨,编码解码=\=加密解密

    一.定义 JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred betw ...

  5. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  6. 提供一个基于.NET的加密/解密算法

    提供一个基于.NET SymmetricAlgorithm 类的.带私钥的加密/解密算法的包装类.使用方法: symmcrypto de = new SymmCrypto(SymmCrypto.Sym ...

  7. 加密解密php,PHP实现的加密解密处理类

    本文实例讲述了PHP实现的加密解密处理类.分享给大家供大家参考,具体如下: /*=========================================================== ...

  8. 加密解密-DES算法和RSA算法

    昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:) 一.DES算法 这种算法如图所示,这里将描述它的每一个步骤.这个算法进行了16次迭代(圈),把各块明文交织起来与 从密钥中获得 ...

  9. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

最新文章

  1. 运行在CentOS7.5上的Django项目时间不正确问题
  2. 南方科技大学宋毅课题组招聘启事
  3. java中table是什么标签_[Java教程]javascript格式化table标签内容
  4. FDATOOL设计数字滤波器
  5. 重磅!百度研究院发布2021年十大科技趋势预测
  6. Galera集群server.cnf参数调整--前言
  7. [HTML5]块和内联元素的嵌套
  8. 2021-09-14基于用 户 行为 序列建模的推荐算法研究
  9. 文本文件和二进制文件的判别
  10. 油库蓝牙+北斗RTK人员定位方案解析
  11. Prometheus+Grafana监控系统部署与使用
  12. 智能时代“无人区”的开拓者,国防科大智能科学学院推免生源大起底
  13. 黑苹果 中文四叶草下载
  14. UNreal 创建一个简单的玻璃材质+金属材质+创建材质实例
  15. “第二课堂”开课啦~
  16. 《般若波罗蜜多心经》注解
  17. 墙裂推荐ShapeView二
  18. Java的来源和基础语法
  19. 基于MFC的OpenDDS发布订阅例子(PubSubDemo)
  20. 程序员自由工作平台国内外汇总篇

热门文章

  1. 借VR产业东风,江西抢滩布局“元宇宙”
  2. 台式计算机按电源开关无法开机,台式电脑没法启动,按下开机键电源灯闪一下就什么反应都没...
  3. 计算机模拟仿真试验有哪些案例,成功案例、申报指南……你想知道的虚拟仿真实验教学项目建设这都有...
  4. Carsim中几个轮胎速度,有关滑移率的设置
  5. 汽车钣金模具设计规范
  6. minio-搭建个人云存储服务
  7. 安装Adobe XD出错
  8. 【爬虫+MongoDB】《星际穿越》豆瓣影评信息爬取
  9. 商家私域流量运营价值考核方式,私域流量池的数据评价指标!
  10. 关于远程桌面进程强制关闭后导致服务崩溃无法连接的修复