io.jsonwebtoken.Безопасность.исключение weakkeyexception: размер ключа проверки равен 48 битам, что недостаточно безопасно для алгоритма HS256

#java #android #base64 #jwt #token

#ява #Android #base64 #jwt #жетон

Вопрос:

Я пытаюсь взять токен из API моего веб-приложения и извлечь из него идентификатор пользователя в Android Studio. Я использую jjwt для декодирования токена, но столкнулся с этой проблемой. Я читал онлайн, и в решениях говорилось, что мой «секретный ключ» находится в базе 64, но это все еще вызывает проблемы.

Я попытался использовать кодировщик и онлайн-кодировщик и жестко закодировать строку base-64 моего «секрета», но все равно возвращает те же проблемы. Ссылка на людей, имеющих похожие проблемы, находится здесь github.com/auth0/node-jsonwebtoken/issues/208

     final TextView tv = (TextView) findViewById(R.id.tvText);

    final String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjOWYzYWI2NzY2Mjg2NDYyNDY0YTczNCIsIm5hbWUiOiJSYW5keSIsImF2YXRhciI6Ii8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvMTNhN2MyYzdkOGVkNTNkMDc2MzRkOGNlZWVkZjM0NTE_cz0yMDAmcj1wZyZkPW1tIiwiaWF0IjoxNTU0NTIxNjk1LCJleHAiOjE1NTQ1MjUyOTV9._SxRurShXS-SI3SE11z6nme9EoaD29T_DBFr8Qwngkg";
    final String secret = "secret";
    String secret64 = "c2VjcmV0";

    String encoded = Base64.encodeToString(secret.getBytes(), Base64.DEFAULT);

    Jws<Claims> jws;
    try {
        jws = Jwts.parser()         // (1)

                .setSigningKey(secret64)       // (2)
                .parseClaimsJws(token); // (3)

        // we can safely trust the JWT

    }
    catch (JwtException ex) {       // (4)
        // we *cannot* use the JWT as intended by its creator
        tv.setText(ex.toString());
    }
  

Комментарии:

1. Чего ты не понимаешь? Ваш «секрет» имеет длину 48 бит, и библиотека жалуется на это.

2. Проблема с GitHub, на которую вы почти разместили ссылку, похоже, не связана.

3. Я думал, что это проблема с jjwt и базой 64, поскольку моя ошибка, возвращаемая ранее, также касалась битов, поэтому я умолчал об этой ошибке. Спасибо за вашу помощь

Ответ №1:

Размер ключа проверки равен 48 битам

Это утверждение рассказывает всю историю. secret Используемый вами ключ слишком короткий. Если вы используете, HS256 который является HMAC с SHA-256 потребностями, по крайней мере, 256 бит или больше должны использоваться с HS256 алгоритмом.

Как указано в веб-алгоритмах JSON

в RFC 7518 веб-алгоритмов JSON указано, что с алгоритмом HS256 ДОЛЖЕН использоваться ключ того же размера, что и выходные данные хэша (например, 256 бит для «HS256») или больше.

Так что измените размер своего ключа, и все готово

Комментарии:

1. О .. Ну, это имеет смысл.. Думаю, я не понял ошибку, когда впервые прочитал ее, но теперь я вижу свою заметную ошибку. Спасибо

Ответ №2:

В целях тестирования, если идея состоит в том, чтобы сгенерировать 256 бит для проверки в качестве секрета, может помочь метод, подобный этому:

 private String generateSafeToken() {
    SecureRandom random = new SecureRandom();
    byte[] bytes = new byte[36]; // 36 bytes * 8 = 288 bits, a little bit more than
                                 // the 256 required bits 
    random.nextBytes(bytes);
    var encoder = Base64.getUrlEncoder().withoutPadding();
    return encoder.encodeToString(bytes);
}