通过控制台的 cookie 信息我们会发现,每次请求之后,关键的 cookie,如PHPSESSID、XSRF-TOKEN 都会发生变化,并且都是很长的一串字符串。

其实这是一个 json 数组,其中包含了 iv,value,mac 三个字段:

这些字段都是在框架加密解密的时候使用的,加密方法是 openssl_encrypt

对 openssl 不太了解的可以看下下面的例子:

$data = 'laravel';
$iv = random_bytes(16);
$key = 'this is key'; $encrypt = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv); var_dump($encrypt);
var_dump(openssl_decrypt($encrypt, 'AES-256-CBC', $key, 0, $iv));

laravel 中的话,key 就是 .env 配置文件里面的 APP_KEY,除了 key 还有两个变化的参数就是 加密、解密的数据以及 iv。

也就是说,如果我们需要加密 cookie 的话,我们至少得保存下 加密后的数据以及 iv。

这样看来,mac 字段似乎有点多余,但是我们可以使用该字段来验证数据的合法性:

如果验证不通过, laravel 也就不会对 data 进行解密操作。

虽然每次请求 cookie 都会发生变化,但是实际数据是没有变的,发生变化只是因为用来加密的 iv 变了(使用 random_bytes 方法生成)。

由于 iv 每次都变化,所以需要把 iv 也一同返回给浏览器,加上验证数据合法性的 mac,最后返回的就是下面的数组的 json编码后在 base64 编码的数据:

[
'iv' => random_bytes(16), // 16位随机字节串
'value' => 'xxxx...', // 加密后的数据
'mac' => 'xxx...' // 后续请求验证数据合法性的字符串
]

  

laravel cookie加密解密原理的更多相关文章

  1. Base64加密解密原理以及代码实现(VC++)

    Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...

  2. php实现cookie加密解密

    1.加密解密类 class Mcrypt { /** * 解密 * * @param string $encryptedText 已加密字符串 * @param string $key 密钥 * @r ...

  3. Base64加密解密原理以及代码实现

    1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.    2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...

  4. Laravel之加密解密/日志/异常处理及自定义错误

    一.加密解密 1.加密Crypt::encrypt($request->secret) 2.解密try { $decrypted = Crypt::decrypt($encryptedValue ...

  5. 【itsdangerous】的加密解密原理(易懂版)

    from itsdangerous import TimedJSONWebSignatureSerializer import time from itsdangerous import Signat ...

  6. 2个比较经典的PHP加密解密函数分享

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些AP ...

  7. PHP加密解密字符串

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些AP ...

  8. PHP 2个比较经典的加密解密函数

    这篇文章主要介绍了2个比较经典的PHP加密解密函数分享,一个是Discuz!的authcode加密函数(带详细分解),一个是encrypt()函数,都比较经典,需要的朋友可以参考下 项目中有时我们需要 ...

  9. 一个经典的PHP加密解密算法

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...

随机推荐

  1. 228. [LeetCode] Summary Ranges

    Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...

  2. Paper Reading - Sequence to Sequence Learning with Neural Networks ( NIPS 2014 )

    Link of the Paper: https://arxiv.org/pdf/1409.3215.pdf Main Points: Encoder-Decoder Model: Input seq ...

  3. Amazon Headlines Update on Activity in US West Coast Ports

    According to news reports, freighter cargo may not be offloaded at U.S. West Coast ports from Februa ...

  4. [leetcode-914-X of a Kind in a Deck of Cards]

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  5. int 和 Integer的区别

    int是基本类型,默认值为0,int a=5;a只能用来计算,一般作为数值参数. Integer是引用类型,默认值为null, Integer b=5;b是一个对象,它可以有很多方法,一般做数值转换, ...

  6. Linux发行版本应用场景

    如果你是一个Linux爱好者,想选择一个桌面系统,并且既不想用盗版,又不想花太多钱购买商业系统软件,那么可以选择Ubuntu桌面系统.如果你需要服务器端的Linux系统,想用一个比较稳定的服务器系统, ...

  7. 【IdentityServer4文档】- 术语&演示服务器和测试

    术语 你需要了解一下,规范.文档和对象模型使用的术语有哪些. IdentityServer IdentityServer 是一个 OpenID Connect 提供程序 - 它实现了 OpenID C ...

  8. 在selenium测试中使用XPATH功能函数starts-with、contains、descendant、ancestor、text()定位网页元素

    项目中一些使用xpath函数的复杂例子,记录于此 1. 使用starts-with //div[starts-with(@id,'res')]//table//tr//td[2]//table//tr ...

  9. bootstrap心得

    最近在弄个人的博客,之前对bootstrap的使用老是感觉使用的一般 幸好在看了慕课网的一个老师的实例教程之后,才感觉是真正对前端使用bootstrap有了一点理解 首先就是. 这些标签,其实都是相当 ...

  10. [转帖]IBM收购Red Hat

    来源cnbeta:https://www.cnbeta.com/articles/tech/782009.htm 2018年10月28 日,IBM 宣布收购 Linux 巨头 Red Hat.公告中称 ...