我不明白为什么存在 JWS 不 protected header 。
对于某些上下文:JWS 不 protected header 包含不受完整性保护的参数,并且只能与 JSON 序列化一起使用每个签名。
如果它们可以用作顶级 header ,我就可以理解为什么有人想要包含可变参数(不会更改签名)。然而,这种情况并非如此。
谁能想到一个用例或知道为什么它们包含在规范中?
谢谢!
JWS Spec
最佳答案
The answer by Florent让我不满意。
关于使用 JWT 对文档的哈希进行签名的示例......断言是算法和 keyID 将是需要“保护”的“敏感数据”。我想他的意思是“签名”。但是不需要对算法和 keyID 进行签名。
例子
假设 Bob 创建了一个签名的 JWT,其中包含一个声明 alg=HS256 和 keyid=XXXX1 的不 protected header 。此 JWT 旨在传输给 Alice。
情况1
假设 Mallory 拦截了 Bob 发送的签名 JWT。 Mallory 然后创建一个新的不 protected header ,断言 alg=None。
接收者(Alice)现在负责验证有效载荷上的签名。 Alice一定不能满足于“没有签名”;事实上Alice must not rely on a client (sender) assertion to determine which signing algorithm is acceptable for her .因此,Alice 拒绝带有人为的“无签名” header 的 JWT。
案例二
假设 Mallory 设计了一个带有 alg=RS256 和 keyId=XXX1 的 header 。现在 Alice 尝试验证签名并找到:
因此 Alice 拒绝了 JWT。
案例3
假设 Mallory 设计了一个带有 alg=HS256 和 keyId=ZZ3 的 header 。现在 Alice 尝试验证签名并发现 key 未知,并拒绝了 JWT。
在任何情况下,算法都不需要成为签名 Material 的一部分。不存在未 protected header 导致漏洞或完整性破坏的情况。
回到最初的问题
最初的问题是:未 protected JWT header 的目的是什么?
简而言之,不 protected JWS header 的目的是允许传输一些可用作对接收者的提示的元数据。像alg(算法)和kid( key ID)。 Florent 建议将数据填充到不 protected header 中可以提高效率。这不是一个很好的理由。这里是关键点:未 protected header 中的声明是提示,不可依赖或信任。
一个更有趣的问题是: protected JWS header 的目的是什么?为什么要同时签署“ header ”和“有效载荷”?对于 JWS protected header , header 和有效负载连接在一起,并对结果进行签名。假设header是JSON,payload是JSON,此时header和payload之间没有语义区别。那么为什么要在标题上签名呢?
人们可以只依赖带有不 protected header 的 JWS。如果需要完整性保护声明,请将它们放入有效负载中。如果需要提示,请将它们放在不 protected 标题中。签署有效载荷而不是 header 。简单的。
这有效,并且有效。但它假定有效负载是 JSON。 JWT 是这样,但并非所有 JWS 都如此。 RFC 7515, which defines JWS , 不需要签名的有效负载为 JSON。想象一下,有效载荷是医学扫描的数字图像。它不是 JSON。人们不能简单地“附加声明”。因此 JWS 允许 protected header ,这样(非 JSON)有效负载和任意声明可以被签名和完整性检查。
在负载为非 JSON 且 header protected 情况下,无法将“额外的非签名 header ”包含到 JWS 中。如果需要发送一些需要完整性检查的数据和一些只是“提示”的数据,那么实际上只有一个容器: protected header 。提示与真实声明一起签名。
只需在要签名的数据周围包装一个 JSON 散列,就可以避免使用这种 protected header 技巧。例如:
{
"image" : "qw93u9839839...base64-encoded image data..."
}
这样做之后,就可以向这个 JSON 包装器添加声明。
{
"image" : "qw93u9839839...base64-encoded image data..."
"author" : "Whatever"
}
然后将签署这些声明并保护其完整性。
但在二进制数据的情况下,将其编码为字符串以允许封装到 JSON 中可能会显着增加数据。具有非 JSON 负载的 JWS 避免了这种情况。
HTH
关于jwt - 您何时会使用不 protected JWS header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291116/