Что такое секретный ключ для аутентификации на основе JWT и как его генерировать?

Недавно я начал работать с аутентификацией на основе JWT. После входа пользователя создается токен, который будет выглядеть как

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ".

Он состоит из трех частей, каждая из которых разделена точкой (.). Первая часть - это заголовок, который закодирован в Base64. После расшифровки мы получим что-то вроде

{
  "alg": "HS256", //Algorithm used
  "typ": "JWT"
}

Вторая часть - это утверждения и кодировка Base64. После расшифровки мы получим что-то вроде

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Третья часть является подписью и генерируется с помощью

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    *secret base64 encoded*
  )  

Теперь, что это за секретный ключ и как его сгенерировать?

Я попробовал какой-нибудь онлайн генератор типа "http://kjur.github.io/jsjws/tool_jwt.html" но Динт получить большую помощь.

Ответ 1

Алгоритм (HS256), используемый для подписи JWT, означает, что секрет является симметричным ключом, который известен как отправителю, так и получателю. Он обсуждается и распределяется вне диапазона. Следовательно, если вы назначенный получатель токена, отправитель должен был предоставить вам секрет вне диапазона.

Если вы отправитель, вы можете использовать произвольную строку байтов в качестве тайны, ее можно сгенерировать или специально выбрать. Вы должны убедиться, что вы предоставляете секрет предполагаемому получателю вне диапазона.

Для записи три элемента в JWT не кодируются base64, а base64url-кодируются, что является вариантом кодирования base64, что приводит к безопасному URL-адресу.

Ответ 2

Вы можете написать свой собственный генератор. Секретный ключ - это, по сути, массив байтов. Убедитесь, что строка, которую вы преобразовываете в массив байтов, кодируется base64. В Java вы можете сделать что-то подобное.

String key = "random_secret_key";
String base64Key = DatatypeConverter.printBase64Binary(key.getBytes());
byte[] secretBytes = DatatypeConverter.parseBase64Binary(base64Key);

Ответ 3

Какой секретный ключ

Секретный ключ объединяется с заголовком и полезной нагрузкой для создания уникального хэша. Вы можете проверить этот хеш, только если у вас есть секретный ключ.

Как сгенерировать ключ

Вы можете выбрать хороший, длинный пароль. Или вы можете создать его с сайта, как это.

Пример (но не используйте этот сейчас):

8Zz5tw0Ionm3XPZZfN0NOml3z9FMfmpgXwovR9fp6ryDIoGRM8EPHAB6iHsc0fb