Байты ключа в кодировке Base64 могут быть указаны только для подписей HMAC - PullRequest
0 голосов
/ 06 мая 2018

Привет, я пишу JWT в Spring Boot, используя Spring Security. Когда я запрашиваю POST на почтальоне, используя приведенные ниже данные в разделе тела

{
"userName": "RAM",
"id":123,
"role": "admin"
}

тогда получаю ошибку ниже

{
    "timestamp": "2018-05-06T14:57:12.048+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.",
    "path": "/token"
}

Я использовал приведенный ниже код для JWT Builder для генератора

   @Component
public class JwtGenerator {

    public String generate(JwtUser jwtUser) {
        // TODO Auto-generated method stub
        Claims claim= Jwts.claims() 
                .setSubject(jwtUser.getUserName());
            claim.put("userId", String.valueOf(jwtUser.getId()));
            claim.put("role", jwtUser.getRole());

            String secret = "YouTube";

            byte[] bytesEncoded = Base64.getEncoder().encode(secret.getBytes());

        return  Jwts.builder().setClaims(claim).signWith(SignatureAlgorithm.ES512, secret).compact();
                //With(SignatureAlgorithm.ES512, bytesEncoded).compact();
                //signWith(SignatureAlgorithm.ES512,"YouTube").compact();

    }

}

Я использовал прямое строковое значение в качестве секретного ключа и 2 другие возможные комбинации, но не смог выяснить проблему. я также предоставил строку кодирования, как и ожидалось DefaultJwtBuilder в JwtBuilder, из кода ниже, но пока нет попадания.

 @Override
    public JwtBuilder signWith(SignatureAlgorithm alg, String base64EncodedSecretKey) {
        Assert.hasText(base64EncodedSecretKey, "base64-encoded secret key cannot be null or empty.");
        Assert.isTrue(alg.isHmac(), "Base64-encoded key bytes may only be specified for HMAC signatures.  If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.");
        byte[] bytes = TextCodec.BASE64.decode(base64EncodedSecretKey);
        return signWith(alg, bytes);
    }

Любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 11 декабря 2018

Алгоритм подписи в вашем коде - ES512, использующий алгоритм эллиптической кривой. Поскольку вы используете секретный ключ, вы хотите использовать алгоритм HMAC с префиксом «HS». Итак, HS256, HS384 или HS512.

Изменение
Jwts.builder().setClaims(claim).signWith(SignatureAlgorithm.ES512, secret).compact();

К
Jwts.builder().setClaims(claim).signWith(SignatureAlgorithm.HS512, secret).compact();

...