首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于RSA的JJWT解码IdToken

基于RSA的JJWT解码IdToken
EN

Stack Overflow用户
提问于 2018-02-15 23:59:16
回答 2查看 2.6K关注 0票数 3

我的客户向我发送一个JWT,我需要使用他们的公钥来验证这个JWT。我正在使用Java和JJWT框架来验证这个令牌。我知道使用HS256解码这个令牌,但使用RS256我不知道。

它们的配置如下:

在这里编辑以改善我的问题。我正在使用的jjwt解析示例:

代码语言:javascript
复制
        Claims String secret = "-----BEGIN CERTIFICATE-----myx5ckey-----END CERTIFICATE-----"
    byte[] dataBytes = Base64.getEncoder().encode(secret.getBytes());
    byte[] byteKey = Base64.getDecoder().decode(dataBytes);
    X509EncodedKeySpec X509publicKey = new X509EncodedKeySpec(byteKey);
    KeyFactory kf = KeyFactory.getInstance("RSA");

    PublicKey publicKey = kf.generatePublic(X509publicKey);

    Claims body = null;
    body = Jwts.parser().setSigningKey(publicKey.getEncoded())
            .parseClaimsJws(idToken)
            .getBody();


java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:205)

如何使用我显示的JWKS信息验证接收到的令牌?(上图)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-17 15:18:08

我解决了我的问题。

代码语言:javascript
复制
String secret2 = "myX5c";
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        Certificate certificate = cf.generateCertificate(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(secret2)));
        PublicKey publicKey = certificate.getPublicKey();


        Claims body = null;
        body = Jwts.parser().setSigningKey(publicKey)
                .parseClaimsJws(idToken)
                .getBody();

@KcDoD谢谢你的建议。

票数 4
EN

Stack Overflow用户

发布于 2018-02-16 04:58:31

tldr;需要遵循三个步骤

  1. JWK提取公钥可能要经过发现文档或任何其他方式。
  2. 提取JWS签名和JWS签名输入,如JWS规范所述
  3. 将公钥、JWS签名和JWS签名输入传递给签名验证器。

根据库的不同,步骤2和步骤3可以一步完成。

长答案

要进行验证,您必须遵循JWS规范。

RFC7515中定义的JWS规范解释了如何创建JWT的MAC以验证令牌。协议的附录2解释了如何使用RS256创建MAC并对其进行验证。

使用发现信息,必须标识公钥。现在,您已经收到了作为JWK的关键细节。根据x5x上JWK协议的定义,

"x5c“(X.509证书链)参数包含一个或多个PKIX证书链

所以基本上你在JWK里有公钥。现在,您需要将x5x的编码字符串转换为公钥。要做到这一点,请检查这个已经回答了问题

一旦构造了公钥,就使用它来验证令牌。以下是从规范中提取出来的内容。

A.2.2.验证

因为"alg“头参数是"RS256",所以我们验证了包含在JWS签名中的RSASSA-PKCS1-v1_5SHA-256数字签名。 验证JWS签名与前面的示例略有不同。我们将公钥(n,e)、JWS签名(从JWS表示中编码的值解码)和JWS签名输入(它是表示的初始子字符串,直到但不包括第二个周期字符)传递给RSASSA-PKCS1-v1_5签名验证器,该验证器已配置为使用SHA-256散列函数。

要验证,最好使用库。作为参考,这里有一个链接,链接到如何使用尼姆布斯完成它

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48818208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档