Что такое JWT

Java

1. Введение

JSON Web Token(JWT) — очень легкая спецификация. Эта спецификация позволяет нам использовать JWT для безопасной и надежной передачи информации между пользователем и сервером.

2 JWT состав

JWT на самом деле представляет собой строку, состоящую из трех частей:голова,нагрузкаа такжеподписать.

2.1 Заголовок Заголовок

Заголовок используется для описания информации о JWT.основная информация, такие как его тип и алгоритм, используемый для подписи. Это также может быть представлено как объект JSON.

{"typ":"JWT","alg":"HS256"}

Заголовок указывает, что алгоритмом подписи является алгоритм HS256. Мы выполняем кодирование BASE64, и закодированная строка выглядит следующим образом:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

Совет: Base64 — это представление двоичных данных, основанное на 64 печатных символах. Поскольку 2 в 6-й степени равно 64, каждые 6 бит представляют собой единицу, соответствующую печатному символу. Три байта имеют 24 бита, соответствующие 4 единицам Base64, то есть 3 байта должны быть представлены 4 печатными символами. JDK предоставляет очень удобные BASE64Encoder и BASE64Decoder, которые можно использовать для простого кодирования и декодирования на основе BASE64.

2.2 полезная нагрузка

нагрузка - это хранениеМесто для достоверной информации. Название, похоже, относится конкретно к грузу, перевозимому на самолете, и достоверная информация состоит из трех частей:

2.2.1 Пункты формулы, зарегистрированные в стандарте (рекомендуется, но не обязательны)

  • iss: эмитент jwt
  • sub: Пользователи, на которые нацелен jwt
  • aud: Сторона, получающая jwt
  • exp: время истечения jwt, это время истечения должно быть больше, чем время выдачи
  • nbf: определяет время, до которого jwt недоступен.
  • iat: время выпуска jwt
  • jti: уникальный идентификатор jwt, который в основном используется как одноразовый токен, чтобы избежать повторных атак.

2.2.2 Публичные заявления

Публичное заявление может добавлять любую информацию, как правило, информацию, относящуюся к пользователям, или другую необходимую информацию для нужд бизнеса. Но добавлять конфиденциальную информацию не рекомендуется, так как эта часть может быть расшифрована на стороне клиента.

2.2.3 Частные объявления

Частный оператор — это оператор, определяемый совместно поставщиком и потребителем.Как правило, не рекомендуется хранить конфиденциальную информацию, поскольку base64 является симметричным дешифрованием, что означает, что эта часть информации может быть классифицирована как информация открытого текста. Это означаеттаможенное требование.

Определите полезную нагрузку:

{"sub":"66777","name":"Jesse","admin":true}

Затем закодируйте его в base64, чтобы получить вторую часть Jwt:

eyJzdWIiOiI2Njc3NyIsIm5hbWUiOiJKZXNzZSIsImFkbWluIjp0cnVlfQ==

2.3 Визовая подпись

Третья часть jwt представляет собойИнформация о визе, эта визовая информация состоит из трех частей:

  • header (после base64) - заголовок
  • полезная нагрузка (после base64) - полезная нагрузка
  • секрет - соль

Эта часть требуетИспользуются заголовок, зашифрованный с помощью base64, и полезная нагрузка, зашифрованная с помощью base64.,ПотомЗашифруйте соленую секретную комбинацию методом шифрования, объявленным в заголовке., что составляет третью часть jwt.

Примечание: Следующий метод HMACSHA256() является методом шифрования, который я случайно нашел в Интернете. Правильность неизвестна. Вы можете понять общий смысл. В любом случае, JJWT автоматически реализует операцию соления.

public static String HMACSHA256(String data, String key) throws Exception {
	Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
	SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
	sha256_HMAC.init(secret_key);
	byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
	StringBuilder sb = new StringBuilder();
	for (byte item : array) {
		sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3);
        }
	return sb.toString().toUpperCase();
}

public static void main(String[] args) throws Exception {
	String encodedString = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI2Njc3NyIsIm5hbWUiOiJKZXNzZSIsImFkbWluIjp0cnVlfQ==";
	String secret = HMACSHA256(encodedString, "secret");
	System.out.println(secret);
}

Выполните описанный выше метод, чтобы распечатать визу:

07EC07E605FF08FA170C8E8FFE214447853EE8D62594CF4C107AD9D4C5FD0713

Объедините эти три части с . в полную строку, что составляет окончательный jwt:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI2Njc3NyIsIm5hbWUiOiJKZXNzZSIsImFkbWluIjp0cnVlfQ==.07EC07E605FF08FA170C8E8FFE214447853EE8D62594CF4C107AD9D4C5FD0713

Примечание: секретхранится на сервере, выдача и генерация jwt также на стороне сервера, секрет используется для выдачи jwt и проверки jwt, так что это закрытый ключ вашего сервера,Это не должно быть раскрыто ни в одной сцене. Как только клиент узнает этот секрет, это означает, что клиент может самостоятельно подписать jwt.