在我正在开发的 Laravel 6x 项目中,我设置了一个 cookie:
Cookie::queue('remember_me', json_encode(['uid' => $user->id, 'token' => $token]),2628000);
我正在读取 cookie 并使用以下命令解密它:
$cookies = Crypt::decrypt(Cookie::get('remember_me'),false);
这工作得很好,除了 $cookies 的值有一个额外的前置字符串和一个 | 。其中的分隔符:
e80cd502fec2a621b624ead8eb1cc91a2e94846b|{"uid":872,"token":"l1214065120208k"}
显然我可以使用它来获得我需要的东西,但我一直无法找到任何关于为什么该字符串和 | 的信息。被添加到 cookie 之前。有任何解释或文档链接吗?
我确实在这里找到了另一个线程有类似的问题但没有答案:
如何在 Laravel 8 中解密 cookie
我还发现一个线程建议 Laravel 8 将 session_id 添加到 cookie 字符串。这就是我在这里看到的吗?
Thanks,
Michael
该值看起来是 cookie 名称的 HMAC-SHA1v2
追加到最后。
这个逻辑的实现是在Cookie值前缀Laravel 中的类,代码如下所示:
public static function create($cookieName, $key)
{
return hash_hmac('sha1', $cookieName.'v2', $key).'|';
}
这用于EncryptCookies中间件相应地进行加密和解密时。相关源码为:
// in decrypt() function
$hasValidPrefix = strpos($value, CookieValuePrefix::create($key, $this->encrypter->getKey())) === 0;
$request->cookies->set(
$key, $hasValidPrefix ? CookieValuePrefix::remove($value) : null
);
// in encrypt() function
$this->encrypter->encrypt(
CookieValuePrefix::create($cookie->getName(), $this->encrypter->getKey()).$cookie->getValue(),
static::serialized($cookie->getName())
)
我把这个逻辑放入CyberChef 页面在这里用我拥有的一些本地cookie对其进行测试并验证输出是否匹配,结果确实如此。如果您去那里插入您的应用程序密钥(最好是一次性密钥),您应该会看到它输出您问题中的哈希值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)