在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名

Posted

技术标签:

【中文标题】在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名【英文标题】:Creating and Verifying JWT signature using public/private key in Spring boot security 【发布时间】:2018-05-22 15:09:34 【问题描述】:

想了解spring boot security中使用公钥和私钥创建JWT签名和验证的过程。

我正在尝试使用 HMAC 算法验证 JWT 令牌。我正在使用硬编码的秘密“MYSECRET”构建 JWT。

Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setAudience(audience)
                .setIssuedAt(createdDate)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, "MYSECRET")
                .compact()

解析代码如下

Jwts.parser()
                .setSigningKey("MYSECRET")
                .parseClaimsJws(token)
                .getBody();

我不想使用签名密钥作为“MYSECRET”,而是使用公钥和私钥

【问题讨论】:

您的代码没有使用spring security,它使用的是jjwt库,可以与spring一起使用,也可以不使用。或者,spring 有自己的 JWT 实现。您想调整您的代码以使用密钥对还是全部重新实现? 【参考方案1】: 生成 JKS Java KeyStore 文件

让我们首先使用命令行工具 keytool 生成密钥——更具体地说是一个 .jks 文件:

keytool -genkeypair -alias mytest -keyalg RSA -keypass 我的密码 -keystore mytest.jks -storepass 我的通行证

导出您的公钥

keytool -list -rfc --keystore mytest.jks | openssl x509 -通知 pem -公钥

使用您的密钥在您的授权服务器中签署令牌。

@Bean
public JwtAccessTokenConverter accessTokenConverter()

    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    KeyStoreKeyFactory keyStoreKeyFactory = 
      new KeyStoreKeyFactory(new ClassPathResource("mytest.jks"), "mypass".toCharArray());
    converter.setKeyPair(keyStoreKeyFactory.getKeyPair("mytest"));
    return converter;

最后在资源服务器中使用你的公钥。

@Bean
public JwtAccessTokenConverter accessTokenConverter() 
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    Resource resource = new ClassPathResource("public.txt");
    String publicKey = null;
    try 
        publicKey = IOUtils.toString(resource.getInputStream());
     catch (final IOException e) 
        throw new RuntimeException(e);
    
    converter.setVerifierKey(publicKey);
    return converter;

【讨论】:

有没有办法在不使用 OAuth 的情况下做到这一点? Oauth2可以使用(或不使用)JWT,但不需要使用非对称密钥对实现JWT认证系统 JWT 我们可以用 JWT 来实现,这很好!我们称之为无状态,它可以使您的应用具有可扩展性,因为您的资源无需检查数据库中的令牌,他们只需验证密钥是否足够! @user8363477 如果您不想使用 oauth2,您只需使用他们的私钥并通过读取文件而不是您的秘密来公开!它会工作我也用它! 您能提供更多描述吗?实际上我是第一次在多模块项目上工作,我不知道我的第二个模块请求应该如何授权。

以上是关于在 Spring Boot 安全性中使用公钥/私钥创建和验证 JWT 签名的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 安全性 + JWT

Spring Boot集成支付宝电脑网站支付功能

关于RSA中公钥和私钥的具体使用情况区分

RSA公钥私钥的作用

非对称加密中的公钥和私钥怎么来的

怎么在ios进行rsa公钥加密,java做rsa私钥解密