如何对 JWK 进行指纹识别?

How to Fingerprint a JWK?

是否有用于为 JWK 创建指纹(又名指纹)的标准规范方法?

从我读到的内容来看,标准似乎没有定义 kid 应该如何指定,我觉得这很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是需要查找 table 的值,这样其他人可以通过拥有 public 密钥轻松地重新创建密钥 ID。

我知道 SSH 指纹和 X.509 指纹是标准化的,但对于所有使用 JWK 的环境(尤其是浏览器)来说,这些似乎都不是 suitable 解决方案,因为它们太复杂了对于天真的实现和包括能够操纵此类的库(即伪造)会浪费大量内存、带宽和 vm 编译时间。

更新

官方称其为 "thumbprint" 而不是 "fingerprint"。

我认为 RFC7638 会回答您的问题。

此 RFC 描述了一种通过 JWK 计算哈希值的方法。

真的很容易实现:

  • 只保留必需的参数。对于 RSA 密钥:ktyne,对于 EC 密钥:crvktyxy.
  • 按字典顺序对这些参数进行排序:ektyn
  • 将参数和值计算成Json:{"e":"AQAB","kty":"RSA","n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2 aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCi FV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65Y GjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n 91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_x BniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw"}
  • 使用 SHA-256 对其进行哈希处理并将其编码为 Base64 Url 安全:NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs

我不相信有一个真正的标准,但这个话题已经在 IETF mailing archives 中讨论过了。虽然谈话似乎因为规范 JSON 总体上是否是个好主意而有点偏离主题,但有一种方法作为标准指纹识别方法似乎是合理的。

  1. 从 JWK 中删除所有 "metadata" 字段(在这种情况下 "metadata" 被定义为任何非必需的密钥,即除了 "kty" 和加密算法的参数之外的任何内容由 JWA RFC-7518).
  2. 定义
  3. 将剥离的 JWK 转换为 "canonical" JSON(按字典顺序对键进行排序,没有前导或尾随空格,并且标记之间没有空格)。
  4. 根据创建的 JSON 字符串计算摘要。

据我所知,规范 JSON 也没有真正的标准,但我看到的所有来源至少同意上面列出的规则(这是唯一应该相关的规则用于 JWK 的对象类型)。