Как создать ключ безопасности Spring для подписи токена JWT? - PullRequest
0 голосов
/ 11 марта 2019

Я использую 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()

Я использовал для предоставления String в application.properties и ссылки на этот ключ, как показано выше, но предоставление String в качестве секретного ключа не рекомендуется. Как мне создать Секрет ключа?

1 Ответ

1 голос
/ 10 апреля 2019

Вам необходимо преобразовать строку ключа в экземпляр 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 использует KeyGenerator провайдера JCA для создания случайного безопасного ключа с правильной минимальной длиной для данного алгоритма.

Если у вас есть существующий байтовый массив HMAC SHA SecretKey, вы можете использовать вспомогательный метод Keys.hmacShaKeyFor. Например:

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