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

js5cn81o  于 2023-08-05  发布在  Spring
关注(0)|答案(2)|浏览(126)

我使用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作为secretkey。我应该如何创建密钥?

oxf4rvwz

oxf4rvwz1#

您需要将密钥字符串转换为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);

xghobddn

xghobddn2#

请看我对类似问题的回答。
https://stackoverflow.com/a/71149603/1808417

//Generating a safe HS256 Secret key
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
String secretString = Encoders.BASE64.encode(key.getEncoded());
logger.info("Secret key: " + secretString);

字符串

相关问题