cookie 中的 HMAC 是否有标准格式?

时间:2021-02-05 17:14:12

标签: http cookies http-headers hmac

给定一个 cookie x 和一个 1 ..

Set-Cookie: x=1

... 添加了 消息验证码 (MAC) y,在本例中带有 | 分隔符。

Set-Cookie: x=1|y

如何将数据 1 和 MAC y 分开?上面使用了分隔符,但如果数据可能包含分隔符,则此方法失败。我考虑过使用 JSON,

{ "data": 1, "mac": "y" }

我认为哪些必须经过 URL 编码?

Set-Cookie: x=%7B%22x%22%3A1%2C%22mac%22%3A%22y%22%7D

是否有标准用于包含 MAC 的 cookie 值的格式?

MAC y 的计算应该与这个问题无关。如有必要,请假设 y 是使用 OpenSSL HMAC SHA-256 计算的。

1 个答案:

答案 0 :(得分:1)

如果我们从 cookie 的 HTTP 标准开始,我们会看到 syntax 对消息签名没有任何特殊支持。 支持的是通过使用 extension-av 语法的属性的任意元数据。所以你可以这样做:

Set-Cookie: x=1;myhmac=y

或者,如 this article 中使用的那样,只需 x=1;y。在实践中,这可能工作正常,但理论上它会遇到与其他元数据使用冲突的问题(如果客户端对 myhmac 应用其他含义怎么办?)。这是任何用于扩展标准的系统都存在的常见问题。

如果 HMAC 不是 HTTP 级别的元数据,那么它必须存储在 cookie 的内容中。您使用包含值和签名的数据结构然后对其进行编码的建议与标准一致:

<块引用>

为了最大限度地提高与用户代理的兼容性,服务器希望 将任意数据存储在 cookie 值中应该对该数据进行编码,例如 例如,使用 Base64。

Base64 肯定比 URL 编码更可取,因为它有一个受限制的字符集,你可以简单地对值本身进行 Base64,然后确保你选择的分隔符(比如 .)不会与价值。因此,您可以简单地执行以下操作,而不是编码 JSON 对象:

Set-Cookie: x=Base64(1).Base64(y)

根据我的经验,这可能是最常见的方法:使用 Base64 作为值和签名,由您选择的分隔符分隔。举一个我熟悉的例子,这就是 Django 处理 message signing 的方式,包括在 cookie 中,使用 : 作为分隔符。

更通用的方法是使用 JSON Web SignaturesJSON Web Tokens 的一部分),这是处理可在标头中使用的签名的建议标准。这种方法类似于上一种方法,但包括元数据(如使用的算法)。紧凑的语法是:

<块引用>

BASE64URL(UTF8(JWS 保护头)) || '.' || BASE64URL(JWS 有效载荷) || '.' || BASE64URL(JWS 签名)

JWT 库可能适用于所有语言。但请注意,JWT 的通用性和复杂性会带来潜在的安全风险,而且许多会warn you away

相关问题