繁体   English   中英

cookies中的HMAC有标准格式吗?

[英]Is there a standard format for HMAC in cookies?

给定一个值为1cookie x ..

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计算。

如果我们从 cookies 的 HTTP 标准开始,我们会看到该语法对消息签名没有任何特殊支持。 支持的使用extension-av语法通过属性的任意元数据。 因此,您可以执行以下操作:

Set-Cookie: x=1;myhmac=y

或者,如本文中所用,简单地x=1;y 在实践中,这可能工作得很好,但理论上它会遇到与其他元数据使用冲突的问题(如果客户端将其他含义应用于myhmac怎么办?)。 这是任何扩展标准的系统的常见问题。

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

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

Base64 肯定比 URL 编码更可取,并且由于它具有受限字符集,您可以简单地 Base64 值本身,然后确保您选择的分隔符(假设不会与值冲突) . 因此,您可以简单地执行以下操作,而不是编码 JSON object:

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

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

A more general approach would be to use JSON Web Signatures (part of JSON Web Tokens ), a proposed standard for handling signatures that can be used in headers. 这种方法与上一种方法类似,但包括元数据(如使用的算法)。 紧凑的语法是:

BASE64URL(UTF8(JWS 保护标头))|| '。' || BASE64URL(JWS 有效负载) || '。' || BASE64URL(JWS 签名)

JWT 库可能以所有语言提供。 但请注意,JWT 的普遍性和复杂性会带来潜在的安全风险,许多人会警告您远离

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM