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

cod*_*eme 5 spring-security spring-boot 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()
Run Code Online (Sandbox Code Playgroud)

我曾经在 中提供一个字符串application.properties并引用该键,如上所示,但不推荐使用字符串作为密钥。我应该如何创建密钥秘密?

Les*_*ood 6

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

您的密钥字符串是 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()
Run Code Online (Sandbox Code Playgroud)

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

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

但是,通常不建议使用第二个示例,因为这可能意味着您的密钥格式不佳。格式良好的安全随机密钥不是人类可读的,因此要将其存储为字符串,密钥字节通常首先进行 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
Run Code Online (Sandbox Code Playgroud)

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

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

byte[] keyBytes = getSigningKeyFromApplicationConfiguration();
SecretKey key = Keys.hmacShaKeyFor(keyBytes);
Run Code Online (Sandbox Code Playgroud)


小智 5

请看对类似问题的回答。

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


归档时间:

查看次数:

9864 次

最近记录:

6 年,8 月 前