Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http Cookie中是否有HMAC的标准格式?_Http_Cookies_Http Headers_Hmac - Fatal编程技术网

Http Cookie中是否有HMAC的标准格式?

Http Cookie中是否有HMAC的标准格式?,http,cookies,http-headers,hmac,Http,Cookies,Http Headers,Hmac,给定一个带有值的cookiex Set-Cookie: x=1 。。添加了消息身份验证代码(MAC)y,在这种情况下使用|分隔符 Set-Cookie: x=1|y 数据1和MACy应该如何分离?上面使用了分隔符,但如果数据可能包含分隔符,则此方法将失败。我考虑过使用JSON {“数据”:1,“mac”:“y”} 我认为这必须是URL编码的 Set-Cookie: x=%7B%22x%22%3A1%2C%22mac%22%3A%22y%22%7D 对于包含Mac的cookie值的格式是否

给定一个带有值的cookie
x

Set-Cookie: x=1
。。添加了消息身份验证代码(MAC)y,在这种情况下使用|分隔符

Set-Cookie: x=1|y
数据
1
和MAC
y
应该如何分离?上面使用了分隔符,但如果数据可能包含分隔符,则此方法将失败。我考虑过使用JSON

{“数据”:1,“mac”:“y”}
我认为这必须是URL编码的

Set-Cookie: x=%7B%22x%22%3A1%2C%22mac%22%3A%22y%22%7D
对于包含Mac的cookie值的格式是否有标准


MAC的计算,
y
,应该与此问题无关。如有必要,请假设
y
是使用计算得出的。

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

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

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

为了最大限度地与用户代理、希望 将任意数据存储在cookie中,例如,值应该对该数据进行编码 例如,使用Base64

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

Set-Cookie: x=Base64(1).Base64(y)
根据我的经验,这可能是最常见的方法:使用Base64作为值和签名,由您选择的分隔符分隔。举一个我熟悉的例子,这就是Django如何使用
作为分隔符来处理,包括在cookie中

Set-Cookie: x=1|y
一种更通用的方法是使用(的一部分),一种用于处理可在标题中使用的签名的拟议标准。此方法类似于上一种方法,但包含元数据(如所使用的算法)。紧凑的语法是:

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

JWT库可能在所有语言中都可用。但是,请注意,JWTs的通用性和复杂性带来了潜在的安全风险,许多JWTs可能会带来安全风险