【问题标题】:How do I use mscapi.RSAPrivateKey for JWT signing?如何使用 mscapi.RSAPrivateKey 进行 JWT 签名?
【发布时间】:2018-05-04 02:49:34
【问题描述】:

我不知道怎么问这个问题,但我正在尝试使用来自网络的各种 Json Web Token 实现(无论是 java-jwt 还是 jjwt 等),它们都将 RSAPrivateKey 作为它们的一部分签名过程。

但是我遇到的问题是,mscapi.RSAPrivateKey 显然没有提供与java.security.interfaces.RSAPrivateKey 相同的 API,当我尝试为其编写包装类时,我不知道如何编写 @ 987654324@ 或 getFormat(我猜我应该返回“RS256”或类似的东西)函数。

  1. 如何包装mscapi.RSAPrivateKey
  2. mscapi.RSAPrivateKey 转换为java.security.interfaces.RSAPrivateKey 的正确方法是什么?

【问题讨论】:

    标签: java jwt digital-signature mscapi jjwt


    【解决方案1】:

    无需获取内容或包装私钥即可签署 JWT。加密提供程序(在您的情况下为 mscapi)有意隐藏内容以保护其不被提取,或者因为它在物理上不可用,例如使用智能卡。但是 mscapi 允许使用该密钥进行签名或加密,因此您的库没有理由不能使用 PrivateKey(不是 RSAPrivate 密钥)的实例对 jwt 进行签名

    您描述的问题类似于this。似乎 jjwt 尝试强制转换 PrivateKey 而 mscapi 包装器没有实现通常的接口。

    如果需要 getEncoded,我认为您不能在 mscapi 密钥上创建包装器,因为正如我所说,您无法访问密钥材料。所以我建议使用jjwt构建令牌(header.payload)并使用标准签名api自己签名

    【讨论】:

    • 这很奇怪,我使用java.security.Signature,通常只使用getInstance,然后将我的PrivateKey 传递给它,并且能够毫无问题地签署所有内容。然而,所有的 JWT 插件,都没有像 Java 那样采用 PrivateKey。这就是我尝试包装它的原因。我确实看过那个帖子,实际上我什至发布了一个问题来问作者:github.com/jwtk/jjwt/issues/273 但是,当我尝试实现接口时,我不确定如何生成getEncoded
    • 哦,伙计,我在圈子里跑来跑去,哈哈。所以事实证明我最初编写的代码是有效的。我正在使用Signature.getInstance("SHA256withRSA") 签名,只是我错误地验证了它,认为我做错了,然后导致我尝试使用 3rd 方 JWT 库来做到这一点......我将在下面发布我的解决方案以防其他人可能对 JWT 感兴趣,但不使用 3rd 方库。
    猜你喜欢
    • 2018-03-27
    • 2023-01-08
    • 2016-08-01
    • 1970-01-01
    • 2022-08-06
    • 2020-11-09
    • 1970-01-01
    • 2022-07-16
    • 2018-09-16
    相关资源
    最近更新 更多