如何在 Laravel 8 中解密 cookie

Posted

技术标签:

【中文标题】如何在 Laravel 8 中解密 cookie【英文标题】:How to decrypt cookies in Laravel 8 【发布时间】:2021-03-22 14:49:42 【问题描述】:

最近,我们将 Laravel 应用程序从 5.6 升级到了 Laravel 8.18.1。我们在RouteServiceProvider.php中使用cookie解密。

HomeController.php

Cookie::queue("channel", "mobile", 60241); // 通道加密 价值 = eyJpdiI6IjJVTGFzZHdEOXpjMk9VTGFFYmlSbXc9PSIsInZhbHVlIjoid0djMW9zbThWOXFQTk5aVXBDNmJBdz09IiwibWFjIjoiZGM4M2U1YTY0ZjVkNTE4NjBlNzg4NTZiNzhkNjdjYzcyODUzZWU1ZWMzNjdkNGNlMTgyZGIwNmQ4NjYzOWM3MSJ9 P>

在 Laravel 5.6 中,它直接将哈希解密为一个值。

RouteServiceProvider.php

$encrypter = app(\Illuminate\Contracts\Encryption\Encrypter::class);
$channel_cookie = $encrypter->decrypt(Cookie::get('channel')); // result "mobile"

在 Laravel 8.18.1 中,它将哈希解密为带有竖线的值。

RouteServiceProvider.php

$encrypter = app(\Illuminate\Contracts\Encryption\Encrypter::class);
$channel_cookie = $encrypter->decrypt(Cookie::get('channel')); // result "a86aa854d5e61e2873acd30373b6725e36fba671|mobile"
$channel_cookie = explode("|",$channel_cookie)[1]; // result mobile

这是在 Laravel 8 中解密 cookie 的安全解决方案吗?

【问题讨论】:

您找到了更好的方法吗?这是一种非常奇怪的解密方式,但我也找不到其他解决方案。 【参考方案1】:

您可以在这个关于在 laravel 中添加 cookie 前缀的安全公告中找到问题的原因。

https://blog.laravel.com/laravel-cookie-security-releases

laravel 执行此操作的代码在下面链接的框架源文件中

https://github.com/laravel/framework/blob/8.x/src/Illuminate/Cookie/CookieValuePrefix.php

在我们的场景中,我们实现了与原始代码类似的东西,用两个词表示:cookie 名称被加密并添加到 cookie 值中,| 作为分隔符。

【讨论】:

这是非常有用的上下文,但没有回答@xyonme 提出的问题。还有其他关于如何以不那么“爆炸性”的方式移除管道的上下文吗? 肯定有一个用于删除前缀的 API:\Illuminate\Cookie\CookieValuePrefix::remove($decryptedCookie),但假设你已经自己解密了 cookie(因此我选择了变量名) .相反,您可以让 API 解密 cookie 并为您删除前缀:\Illuminate\Support\Facades\Cookie::get($cookie),您将看到您将获得相同的值。

以上是关于如何在 Laravel 8 中解密 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 cookie 数组 Laravel 8 中的特定值

如何在 Laravel Lumen 8 中设置响应的 cookie

给定会话密钥和秘密,我们如何解密 Rails cookie?

foreach() 参数必须是数组|对象类型,使用 cookie 时在 Laravel 8 中给出的字符串

在 Laravel 中处理加密文件(如何下载解密文件)

在 Laravel 中处理加密文件(如何下载解密文件)