#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);
}