当前位置:首页 > 编程教程 > php技术文章 > yii2中关于加密解密的那些事儿

yii2中关于加密解密的知识点总结

  • 发布时间:
  • 作者:码农之家
  • 点击:122

这篇文章主要知识点是关于yii、加密解密、yii2、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

PHP开发实例大全:提高卷
  • 类型:PHP开发大小:241.1 MB格式:PDF作者:软件开发技术联盟
立即下载

Tags:加密解密 yii2 YII 

yii2中关于加密解密的那些事儿

前言

Yii提供了方便的帮助函数来让你用一个安全秘钥来加密解密数据。数据通过加密函数进行传输,这样只有拥有安全秘钥的人才能解密。比如,我们需要存储一些信息到我们的数据库中,但是,我们需要保证只有拥有安全秘钥的人才能看到它(即使应用的数据库泄露)。

大家也都知道,我们做程序的时候,加密解密是绕不开的话题,使用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()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对码农之家的支持。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • YII框架行为behaviors用法详解
  • 本文实例讲述了YII框架行为behaviors用法。分享给大家供大家参考,具体如下: 文件 frontend/libs/FilterTest.php ?php/** * Created by PhpStorm. * Date: 2016/5/27 * Time: 14:16 */namespace frontend\libs;use Yii;use yii\base\Action;use yii\base\ActionFilter;class FilterTest extends ActionFilter{ //在action之前运行,可用来过滤输入 public function beforeAction($action) { echo 在调用action前显示br/; return TRUE;//如果返回值为false,则action不会运行……

  • PHP的Yii框架中移除组件所绑定的例子分享
  • 要移除行为,可以调用 yii\base\Component::detachBehavior() 方法用行为相关联的名字实现: $component-detachBehavior(myBehavior1); 也可以移除全部行为: $component-detachBehaviors(); 这上面两种方法,都会调用到 yii\base\Behavior::detach() ,其 public function detach(){ // 这得是个名花有主的行为才有解除一说 if ($this-owner) { // 遍历行为定义的事件,一一解除 foreach ($this-events() as $event = $handler) { $this-owner-off($ev……

  • 实例分享Yii2中SqlDataProvider用法
  • 本文实例讲述了Yii2中SqlDataProvider用法。分享给大家供大家参考,具体如下: 第一种方法: $totalCount = Yii::$app-db-createCommand(SELECT COUNT(*) FROM posts WHERE publish=:publish, [:publish = 1]) -queryScalar();$dataProvider = new SqlDataProvider([ sql = SELECT * FROM posts WHERE publish=:publish, params = [:publish = 1], totalCount = $totalCount, //sort =false, to remove the table header sorting sort = [ attributes = [ title = [ asc = [title = SORT_ASC], desc = [……

  • YII框架学习笔记之命名空间、操作响应与视图操作方法
  • 本文实例讲述了YII框架命名空间、操作响应与视图操作。分享给大家供大家参考,具体如下: YII基础准备 1.命名空间 ?php/****假设有三个同名的类,输出的值为A,B,C****/use a\b\c\apple;use d\e\f\apple as bApple;use g\h\i\apple;$app = new apple();//A$app = new bApple();//B$app = new \Apple();//C 调用的是全局的 2.操作响应 ?php namespace app\controllers;use yii\web\Controller;use yii\data\Pagination;use app\models\Country;class CountryC……

  • Yii2.0乐观锁与悲观锁的原理用法
  • 本文介绍了深入理解Yii2.0乐观锁与悲观锁的原理与使用,分享给大家,具体如下: Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能。 在并发环境下,有可能会出现脏读(Dirty Read)、不可重复读(Unrepeatable Read)、 幻读(Phantom Read)、更新丢失(Lost update)等情况。具体的表现可以自行搜索。 为了应对这些问题,主流数据……

    yii加密解密 相关电子书
    学习笔记
    网友NO.753191

    Yii2处理密码加密及验证的方法

    在Yii2中提供了密码加密以及验证的一系列方法,方便我们的使用,它使用的是bcrypt算法。查看源码我们可以发现它使用的是PHP函数password_hash()和crypt()生成。 加密: /** * $password 要加密的密码 * $hash 加密后的hash字符串 */$hash = Yii::$app-getSecurity()-generatePasswordHash($password); 验证密码: /** * $password 要验证的明文密码 * $hash 加密后的hash字符串 */Yii::$app-getSecurity()-validatePassword($password, $hash); 总结 以上所述是小编给大家介绍的Yii2处理密码加密及验证的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的! ……

    网友NO.940017

    Yii2框架可逆加密简单实现方法

    本文实例讲述了YII2框架可逆加密简单实现方法。分享给大家供大家参考,具体如下: 加密: $data 是你要加密的内容 $secretKey 是你自己设置的salt $encryptedData = Yii::$app-getSecurity()-encryptByPassword($data, $secretKey); 解密: $encryptedData 是你要解密的内容 $secretKey 是你自己设置加密时的salt $data = Yii::$app-getSecurity()-decryptByPassword($encryptedData, $secretKey); PS:关于加密解密感兴趣的朋友还可以参考本站在线工具: 文字在线加密解密工具(包含AES、DES、RC4等): http://tools.jb51.net/password/txt_encode MD5在线加密工具: http://tools.jb51.net/password/CreateMD5Password 在线散列/哈希算法加密工具: http://tools.jb51.net/password/hash_encrypt 在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具: http://tools.jb51.net/password/hash_md5_sha 在线sha1/sha224/sha256/sha384/sha512加密工具: http://tools.jb51.net/password/sha_encode 更……

    <
    1
    >

    电子书 编程教程 PC软件下载 安卓软件下载

    Copyright 2018-2020 xz577.com 码农之家

    本站所有电子书资源不再提供下载地址,只分享来路

    免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

    版权投诉 / 书籍推广 / 赞助:QQ:520161757