我正在尝试在 Java 中实现 Diffie-Hellman 密钥交换,但我很难理解规范:
根据 JWA (RFC 7518) 在 Direct Key Agreement 模式下使用曲线 P-256、dT 和 QC 作为本地机制完成 Diffie-Hellman 密钥交换过程,以生成由 Transaction 标识的一对 CEK(每个方向一个) ID。此版本规范支持的参数值为:
- “alg”:ECDH-ES
- “apv”:SDK 参考编号
- “epk”:QC,JSON Web Key (JWK) 格式
- {“kty”:“EC”“crv”:“P-256”}
- 所有其他参数:不存在
- CEK:“kty”:oct - 256 位
创建以下数据的 JSON 对象作为要签名的 JWS 负载:
{“MyPublicKey”:“QT”,“SDKPublicKey”:“QC”}
根据 JWS (RFC 7515) 使用 JWS 紧凑序列化生成完整 JSON 对象的数字签名。此版本规范支持的参数值为:
- “alg”:PS256 或 ES256
- “x5c”:X.5C v3:Cert(MyPb) 加上可选的链接证书
据我了解,ECDH 会生成一个密钥。在共享我的临时公钥 (QT) 后,SDK 会生成相同的密钥,因此我们以后可以交换使用相同密钥加密的 JWE 消息。
JSON {“MyPublicKey”: “QT”, “SDKPublicKey”:” QC”} 将被签名并发送,但我不明白我将如何使用apv和epk ,因为这些标头参数用于JWE而不是第一个要共享的JWS 。
在同一规范中,他们谈论这些 JWE 消息,但他们没有这些 apv 和 epk 参数。
根据 JWE (RFC 7516) 使用与 SDK 相同的“enc”算法加密 JSON 对象,获得的 CEK 由“kid”和 JWE Compact Serialization 标识。此版本规范支持的参数值为:
- “alg”:目录
- “enc”:A128CBC-HS256 或 A128GCM
- “孩子”:交易 ID
- 所有其他参数:不存在
我还阅读了RFC 7518中的示例,在那里我可以看到正在使用的标头参数 apv 和 epk,但我不确定哪些标头参数是 JWE 还是 JWS?
任何关于如何使用 nimbus-jose-jwt 或任何其他 java 库来实现的想法都会非常有帮助。谢谢