如何对 JWK 进行指纹识别?
How to Fingerprint a JWK?
是否有用于为 JWK 创建指纹(又名指纹)的标准规范方法?
从我读到的内容来看,标准似乎没有定义 kid
应该如何指定,我觉得这很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是需要查找 table 的值,这样其他人可以通过拥有 public 密钥轻松地重新创建密钥 ID。
我知道 SSH 指纹和 X.509 指纹是标准化的,但对于所有使用 JWK 的环境(尤其是浏览器)来说,这些似乎都不是 suitable 解决方案,因为它们太复杂了对于天真的实现和包括能够操纵此类的库(即伪造)会浪费大量内存、带宽和 vm 编译时间。
更新
官方称其为 "thumbprint" 而不是 "fingerprint"。
我认为 RFC7638 会回答您的问题。
此 RFC 描述了一种通过 JWK 计算哈希值的方法。
真的很容易实现:
- 只保留必需的参数。对于 RSA 密钥:
kty
、n
和 e
,对于 EC 密钥:crv
、kty
、x
和 y
.
- 按字典顺序对这些参数进行排序:
e
、kty
和 n
- 将参数和值计算成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 总体上是否是个好主意而有点偏离主题,但有一种方法作为标准指纹识别方法似乎是合理的。
- 从 JWK 中删除所有 "metadata" 字段(在这种情况下 "metadata" 被定义为任何非必需的密钥,即除了 "kty" 和加密算法的参数之外的任何内容由 JWA RFC-7518).
定义
- 将剥离的 JWK 转换为 "canonical" JSON(按字典顺序对键进行排序,没有前导或尾随空格,并且标记之间没有空格)。
- 根据创建的 JSON 字符串计算摘要。
据我所知,规范 JSON 也没有真正的标准,但我看到的所有来源至少同意上面列出的规则(这是唯一应该相关的规则用于 JWK 的对象类型)。
是否有用于为 JWK 创建指纹(又名指纹)的标准规范方法?
从我读到的内容来看,标准似乎没有定义 kid
应该如何指定,我觉得这很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是需要查找 table 的值,这样其他人可以通过拥有 public 密钥轻松地重新创建密钥 ID。
我知道 SSH 指纹和 X.509 指纹是标准化的,但对于所有使用 JWK 的环境(尤其是浏览器)来说,这些似乎都不是 suitable 解决方案,因为它们太复杂了对于天真的实现和包括能够操纵此类的库(即伪造)会浪费大量内存、带宽和 vm 编译时间。
更新
官方称其为 "thumbprint" 而不是 "fingerprint"。
我认为 RFC7638 会回答您的问题。
此 RFC 描述了一种通过 JWK 计算哈希值的方法。
真的很容易实现:
- 只保留必需的参数。对于 RSA 密钥:
kty
、n
和e
,对于 EC 密钥:crv
、kty
、x
和y
. - 按字典顺序对这些参数进行排序:
e
、kty
和n
- 将参数和值计算成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 总体上是否是个好主意而有点偏离主题,但有一种方法作为标准指纹识别方法似乎是合理的。
- 从 JWK 中删除所有 "metadata" 字段(在这种情况下 "metadata" 被定义为任何非必需的密钥,即除了 "kty" 和加密算法的参数之外的任何内容由 JWA RFC-7518). 定义
- 将剥离的 JWK 转换为 "canonical" JSON(按字典顺序对键进行排序,没有前导或尾随空格,并且标记之间没有空格)。
- 根据创建的 JSON 字符串计算摘要。
据我所知,规范 JSON 也没有真正的标准,但我看到的所有来源至少同意上面列出的规则(这是唯一应该相关的规则用于 JWK 的对象类型)。