如何创建用于签名JWT令牌的Spring Security密钥?

时间:2019-03-11 13:29:26

标签: spring-boot spring-security jjwt

我使用implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.10.6'作为依赖项。

我想创建一个JWT令牌,如下所示:

@Value("${jwt.token.secret}")
private Key secret;

JwtToken.builder().value(Jwts.builder()
                .setClaims(createClaims(account))
                .setSubject(subject.toString())
                .setIssuedAt(Date.from(createdDateTime))
                .setExpiration(Date.from(expirationDateTime))
                .signWith(secret)
                .compact()).expiration(expirationDateTime.toString()).build()

我以前在application.properties中提供了一个String并引用了该密钥,如上所示,但是不建议将String作为密钥使用。我应该如何创建密钥秘密?

1 个答案:

答案 0 :(得分:1)

您需要将密钥字符串转换为Java Key实例。

您的密钥字符串是Base64编码的吗?如果是这样,请执行以下操作:

@Value("${jwt.token.secret}")
private String secret;

private Key getSigningKey() {
  byte[] keyBytes = Decoders.BASE64.decode(this.secret);
  return Keys.hmacShaKeyFor(keyBytes);
}

JwtToken.builder().value(Jwts.builder()
                .setClaims(createClaims(account))
                .setSubject(subject.toString())
                .setIssuedAt(Date.from(createdDateTime))
                .setExpiration(Date.from(expirationDateTime))
                .signWith(getSigningKey())
                .compact()).expiration(expirationDateTime.toString()).build()

如果您的密钥不是以base64编码的(可能应该是,因为例如,如果您使用的是原始密码,则您的密钥可能不正确或格式不正确),您可以通过以下方式进行操作:

private Key getSigningKey() {
  byte[] keyBytes = this.secret.getBytes(StandardCharsets.UTF_8);
  return Keys.hmacShaKeyFor(keyBytes);
}

但是通常不建议使用第二个示例,因为它可能意味着您的密钥格式不正确。格式正确的安全随机密钥不是人类可读的,因此要存储为字符串,密钥字节通常首先是base64编码的。

从文档https://github.com/jwtk/jjwt#jws-key-create

  

如果要生成足够强大的SecretKey以与JWT HMAC-SHA算法一起使用,请使用Keys.secretKeyFor(SignatureAlgorithm)帮助程序方法:

     
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256); //or HS384 or HS512
     

在幕后,JJWT使用JCA提供者的KeyGenerator来为给定算法创建具有正确最小长度的安全随机密钥。

     

如果您已有HMAC SHA SecretKey的编码字节数组,则可以使用Keys.hmacShaKeyFor帮助方法。例如:

     
byte[] keyBytes = getSigningKeyFromApplicationConfiguration();
SecretKey key = Keys.hmacShaKeyFor(keyBytes);