【问题标题】:Why does Laravel change the value of cookie for every request?为什么 Laravel 每次请求都会改变 cookie 的值?
【发布时间】:2020-01-12 11:47:21
【问题描述】:

我了解用户登录后需要重新生成 session_id 以防止会话固定攻击。并且session_id需要是随机字符串,防止被攻击暴力破解。

所以 Laravel 需要一些东西来加密 session_id。

但是为什么 Laravel 为 session_id 选择加密而不是散列呢?

我查看了 Laravel 对会话使用 AES 加密的文档。

但是,为什么 Laravel 选择在 session_id 被加密后每次都产生不同值的加密方法?

为 session_id 生成固定值,然后为那个 cookie 设置它的加密方法有什么问题?

为什么每次新的请求都会改变 session_id 的 cookie 值?

【问题讨论】:

  • Laravel 需要能够解密 session_id,如果 t 是哈希值,它就无法解密。
  • 是的,现在说得通了。但是我想知道这里的MAC(消息验证码)有什么用。加密/解密过程的哪一部分涉及到 HMAC 方法。 HMAC 是使用 APP_KEY 对原始会话数据进行哈希处理,还是使用 APP_KEY 对加密会话数据进行哈希处理?如果数据被 HMAC 散列(或签名),它确实阻止了客户端修改,但是如何反转散列值以获取原始会话数据?

标签: php laravel security session cookies


【解决方案1】:

我接受了 Danyal Sandeelo 的回答。

cookie的值是加密的, 其中包含两件事——session_id 和 HMAC 哈希字符串。

HMAC 哈希字符串在服务器上使用 APP_KEY 进行哈希处理: HMAC(session_id,APP_KEY)。然后服务端使用AES加密后发送给客户端。

AES 加密即使使用相同的密钥使用相同的明文也会产生不同的密文。

当cookie的加密值被发送回后端时, 服务器将首先对其进行解密以获取 session_id 和 HMAC 哈希字符串。 然后它将使用 APP_KEY 到 HMAC-hash session_id 来查看结果值是否与返回的 HMAC 哈希字符串匹配。

如果不匹配,则说明 session_id 被客户端篡改了。

而且每次请求都会改变会话 cookie 的值,这是因为 AES 加密即使使用相同的密钥使用相同的明文也会产生不同的密文。

【讨论】:

    【解决方案2】:

    这个问题不仅与 Laravel 有关,而且更像是Dynamic 加密与Static 加密,无论语言和框架如何。

    您可以加密一个值,但不能对哈希值进行去散列处理。由于数据将在以后使用,我们对其进行加密,以便以后可以解密。

    动态加密提供额外的保护,因为每次数据传输时不仅加密密钥而且加密系统的配置都会发生变化。内部加密算法(例如 AES-256 或国家算法)由外部动态加密算法包装。当数据传输完成后,加密算法被丢弃,没有办法引入主密钥进行数据检查。

    Cryptanalysis(密码破解)通常需要使用相同的方法对大量数据进行加密。由于动态加密不断变化,密码分析实际上是不可能的。

    Here 很好地了解了为什么使用动态加密。

    【讨论】:

    • 所以会话cookie的值不是哈希值。这样 tt 在发送回服务器时就可以解密。但 Laravel 提到它使用 HMAC 来防止 AES 加密值被客户端篡改。我想知道 HMAC 吸收了哪一部分。
    【解决方案3】:

    这里使用的驱动程序很重要。

    cookie 驱动程序将所有信息存储在 cookie 中,因此 Laravel 需要能够解密该值以读取它,并且该值每次都会更改,因为每次请求都会修改会话,从而导致不同的数据被加密,因此您在 cookie 中看到的加密字符串在每个请求中都不同。

    但是,当使用文件驱动程序(或文件或数组以外的任何其他驱动程序)时,Laravel 仍然需要能够读取纯文本会话 ID(因此加密而不是散列)才能在数据存储中查找它但存储数据在文件/数据库/redis 中,由于会话 ID 不会改变,因此应该在会话期间保持 cookie 值相同。

    详细了解所有驱动程序以及数据存储在 de documentation 的位置。

    【讨论】:

      【解决方案4】:

      Laravel 更改它是因为隐私.....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        相关资源
        最近更新 更多