Что такое секретный ключ для аутентификации на основе 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