什么是 connect/expressjs 中的“签名”cookie?

Posted

技术标签:

【中文标题】什么是 connect/expressjs 中的“签名”cookie?【英文标题】:What are "signed" cookies in connect/expressjs? 【发布时间】:2012-08-07 12:53:49 【问题描述】:

我试图弄清楚“签名 cookie”到底是什么。 网上没有多少,如果我试试这个:

app.use(express.cookieParser('A secret'));

但是……Cookies 在浏览器上仍然是 100% 正常的,我真的不知道这里的“签名”是什么(我有点希望在客户端上“看到”一些奇怪的东西,比如使用“秘密”作为盐加密的数据?)

文档说 (https://github.com/expressjs/cookie-parser):

解析 Cookie 标头并填充 req.cookies 以 cookie 名称为键的对象。可选 您可以通过传递启用签名的 cookie 支持 一个secret 字符串,它分配req.secret 所以 它可能被其他中间件使用。

有人知道吗?

佣兵。

【问题讨论】:

需要注意的是,如果 cookie 值的熵(即会话 id)已经很高,并且与签名本身的熵(256 位在 HMAC SHA256 的情况下)。这很好解释here 和there。 【参考方案1】:

cookie 仍然是可见的,但它有一个签名,因此它可以检测客户端是否修改了 cookie。

它通过创建值(当前 cookie)的HMAC 来工作,并对其进行 base64 编码。当 cookie 被读取时,它会重新计算签名并确保它与附加到它的签名匹配。

如果不匹配,则会报错。

如果您还想隐藏 cookie 的内容,则应该对其进行加密(或仅将其存储在服务器端会话中)。我不确定是否已经有中间件。

编辑

并创建一个您将使用的签名 cookie

res.cookie('name', 'value', signed: true)

要访问签名的 cookie,请使用 reqsignedCookies 对象:

req.signedCookies['name']

【讨论】:

谢谢!但是...我目前没有看到附加到 cookie 上的签名。也就是说,在客户端中,cookie 没有签名。除了在express.cookieParser() 中包含秘密消息之外,我还需要做些什么来启用 cookie 签名吗? 等一下...我正在使用res.cookie('somethingElseAgainAndAgain', 'signed? Maybe' ); 设置cookie,但是...我怀疑这是在签名! cookieParser() 中间件已准备好解析签名的 cookie,但我肯定没有正确设置...我必须手动签名吗...? 它是:(res.cookie(name, value, signed: true ))。报告文档中缺少的“详细信息”... 劫持会话是不同的......即用户 B 获取用户 A 的身份。签名的 cookie 只是一种验证用户没有更改 cookie 内容的方法,所以内容可以被信任。 值得一提的是If it does not match, then it will give an error. 不是错误。只是那个键的 request.signedCookie isn't set 。所以更像忽略【参考方案2】:

我使用的是 cookie-parser 1.4.4 版本。

我可以在浏览器中添加签名 cookie 和加密的签名 cookie,如果我尝试使用 editThisCookie(chrome 插件)编辑签名 cookie,那么 cookie 解析器会检测到外部更改,然后将 false 设置为值。

response.cookie('userId',401,signed: true)

浏览器中的响应头,显示为

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

获取签名的 cookie

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c

【讨论】:

【参考方案3】:

我一直在寻找一个很好的答案... 查看cookie-signature 的源代码,cookie-parser 使用它来签署签名的 cookie,这让我对什么是签名的 cookie 有了更好的理解。

val当然是cookie的值,secret是你作为选项添加到cookie-parser的字符串

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16

【讨论】:

这是一个保留的规范链接:github.com/tj/node-cookie-signature/blob/… 阅读代码确实是一个更好的解释。谢谢!【参考方案4】:

是的,就像 emostar 提到的那样,它只是为了确保一个值没有被篡改。它被放置在不同的对象 (req.signedCookies) 中以区分两者,从而允许开发人员显示意图。如果它们与其他人一起存储在 req.cookies 中,则某人可以简单地制作一个同名的未签名 cookie,从而破坏它们的全部目的。

【讨论】:

以上是关于什么是 connect/expressjs 中的“签名”cookie?的主要内容,如果未能解决你的问题,请参考以下文章

什么是多头模型?模型中的“头”到底是什么?

电脑中的MBR是啥?

商品期货中的PPPE是啥?

c++中的ATL是用来干啥的?

气象中的QPF是啥意思

什么是 .在 Python 中的 import 语句中是什么意思?