jwt - 您何时会使用不 protected JWS header ?

标签 jwt json-web-token jose json-web-signature

我不明白为什么存在 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 尝试验证签名并找到:

  • 算法不合规
  • 为该算法指定的 key 不存在

  • 因此 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/

    相关文章:

    jwt - Sequelize - 模型设置方法不起作用,我没有收到任何错误

    c# - 为什么即使我将 Expires 设置为 null,JWT 也会包含 EXP 声明?

    c# - 使用 Microsoft 的 IdentityModel 验证 JWT

    typescript - 编写一个带有导入子路径 typescript 选项的包

    python - 如何加密字典数据?

    java - 如何验证 header 中包含 "crit"值的 JWSObject?

    jwt - npm 模块 jsonwebtoken 和 jwt-simple 有什么区别?

    ruby - 在 Ruby 中生成 JWT

    spring - JWT 与 Spring OAuth2

    local-storage - JWT过期后,本地存储的JWT会自动移除吗?