Rails 中签名和加密的 cookie 有啥区别?

Posted

技术标签:

【中文标题】Rails 中签名和加密的 cookie 有啥区别?【英文标题】:What is the difference between signed and encrypted cookies in Rails?Rails 中签名和加密的 cookie 有什么区别? 【发布时间】:2017-05-18 22:22:49 【问题描述】:

ActionDispatch::Cookies 的文档对签名 cookie 和加密 cookie 给出了几乎相同的描述。似乎两者都使用secrets.secret_key_base 来防止客户端篡改。 http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html

签名的 Cookies

设置一个签名的cookie,防止用户篡改它的值。 cookie 由您的应用程序的 secrets.secret_key_base 值签名。 可以使用签名方法cookies.signed[:name]读取

cookies.signed[:user_id] = current_user.id

加密的 cookie

在发送给客户端之前设置一个加密的 cookie 值 防止用户阅读和篡改其价值。 cookie 由您的应用程序的 secrets.secret_key_base 值签名。 可以使用加密方式cookies.encrypted[:name]读取

cookies.encrypted[:discount] = 45

我的问题是:两者有什么区别?

您想在什么时候使用一个而不是另一个?

【问题讨论】:

【参考方案1】:

签名的 Cookies

属性:客户端可以读取,服务器防止篡改值。

用法:前端的只读值(没有意义 HttpOnly

通常就像加密的 cookie,但由于设计缺陷,客户端(浏览器)也需要访问其值。

我想不出一个合适的例子......也许在没有服务器端存储的情况下存储用户数据,同时保证其有效性? (虽然效率不是很高)

加密的 cookie

属性:客户端获取的秘密,无法读取/写入,将返回给服务器。

用法:克服http的无状态部分,例如会话(没有意义没有 HttpOnly

总结

我会说使用签名的 cookie 始终是一个糟糕的架构决策。但在极端限制下(没有服务器端存储,浏览器中没有 javascript)可能是唯一剩下的解决方案。

【讨论】:

【参考方案2】:

这很微妙,但答案在您提供的文档中。签名 cookie 仅防止篡改,而加密 cookie 防止读取和篡改。

更具体地说,签名的 cookie 调用 ActiveSupport::MessageVerifier 将摘要(使用 secret_key_base 生成)附加到 cookie。如果 cookie 的值被修改,则摘要将不再匹配,并且在不知道 secret_key_base 的值的情况下,无法对 cookie 进行签名。然而,cookie 的值只是 base64 编码,任何人都可以读取。

名为ActiveSupport::MessageEncryptor 的加密 cookie 用于在生成摘要之前实际加密 cookie 的值。与签名cookie类似,如果cookie的值被修改,则摘要将不再匹配,但如果没有secret_key_base,cookie的值将无法解密。

至于您何时使用加密或签名 cookie,这取决于您存储在 cookie 中的信息的敏感性。如果您只想防止有人修改 cookie,请对其进行签名 - 但如果您还需要对数据保密,请对其进行加密。

【讨论】:

优秀的答案!感谢您的详细说明。 @7urkm3n,我从未对这两者进行过基准测试,但我怀疑加密的 cookie 会因为涉及更多工作而变慢。话虽如此,我想除非您处理数百万个 cookie,否则任何性能差异都可以忽略不计。 默认情况下加密 cookie 值是否是一种好习惯?因为 cookie 应该只能被服务器代码理解 @Cyber​​Mew,Rails 从版本 4 开始默认使用加密会话 cookie,因此最好为您自己的 cookie 这样做。 @Brian,有没有关于这个的官方文档?我无法在任何官方页面上找到此声明。

以上是关于Rails 中签名和加密的 cookie 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

签名证书和加密证书有啥区别?

AES DES加密有啥区别啊?

DSA 和 RSA 有啥区别?

当我想使 JWT 令牌无效时,JWT 和 session-cookie 有啥区别?

对cookie-parser的理解(签名加密)

控制器中的 request.cookies 和 cookie 有啥区别?