Skip to content

Бесплатный генератор JWT-секрета — HS256/384/512

Создайте надёжный JWT-секрет по RFC для HS256/384/512 — 100% в браузере, ничего не уходит на сервер. base64url, base64 или hex; копия для .env.

Без отслеживания Работает в браузере Бесплатно
Ваш секрет генерируется локально с помощью crypto.getRandomValues и никогда не загружается, не логируется и не сохраняется. Он остаётся на этом устройстве.
16 64

Эквивалентные команды CLI

Проверено на корректность длины ключа по RFC 7518 §3.2, точность кодировок RFC 4648 для base64url / base64 / hex, источник CSPRNG (crypto.getRandomValues, никогда Math.random), приватность сгенерированного секрета без сети и хранения и доступность (подписанные элементы управления, маскирование показать/скрыть, объявления для экранных читалок при генерации и копировании). — Команда безопасностного инструментария Go Tools · Jun 16, 2026

Что такое генератор JWT-секрета?

Генератор JWT-секрета создаёт случайный ключ подписи, который использует JSON Web Token, подписанный HMAC, чтобы доказать, что он не был подделан. Когда вы подписываете токен с HS256, HS384 или HS512, алгоритм выполняет HMAC над заголовком и полезной нагрузкой токена, используя один общий секрет; проверяющий пересчитывает тот же HMAC с тем же секретом и принимает токен только при совпадении подписей. Вся безопасность этой схемы держится на том, что секрет длинный и непредсказуемый — именно это и создаёт инструмент: высокоэнтропийную случайную строку, сгенерированную в вашем браузере, корректно подобранную под выбранный алгоритм.

Стоит чётко обозначить, что этот инструмент делает, а что нет. Он генерирует секретный ключ — значение, которое вы кладёте в переменную окружения JWT_SECRET — а не готовый токен. Если вы хотите собрать заголовок и полезную нагрузку и подписать их в настоящий JWT, это работа JWT-кодировщика; чтобы разобрать существующий токен и проверить его подпись, используйте JWT-декодер. Считайте секрет ключом, а кодировщик — замком, которым он управляет: вы генерируете ключ один раз, надёжно храните и переиспользуете для подписи и проверки множества токенов.

Какой длины должен быть ключ? Ответ задан спецификацией, а не предпочтением. RFC 7518 §3.2 — стандарт JSON Web Algorithms — требует, чтобы HMAC-ключ был не меньше выхода хеша: «ДОЛЖЕН использоваться ключ того же размера, что и выход хеша (например, 256 бит для HS256), или больше». Это даёт чёткую таблицу, которой генератор следует автоматически:

| Алгоритм | HMAC | Мин. байт | Мин. бит | hex-символов | base64-символов | base64url-символов | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

Число символов вытекает из кодировок RFC 4648 этих длин в байтах: hex удваивает число байтов; base64 расширяет на 4⁄3 с заполнением; base64url отбрасывает заполнение, поэтому 32-байтный ключ — это 43 символа base64url, а не 44. base64url — родная кодировка JWT — URL-безопасный алфавит, без заполнения — поэтому он здесь вывод по умолчанию; секрет в base64url может находиться в заголовке, URL или значении конфига без экранирования.

Случайность — это то, на чём нельзя идти на компромисс. Этот генератор берёт байты из crypto.getRandomValues — криптографически стойкого псевдослучайного генератора браузера, того же примитива, что лежит в основе генерации ключей Web Crypto. Он никогда не использует Math.random, который быстр, но предсказуем и совершенно непригоден для ключа подписи — предсказуемый ГСЧ означает угадываемый секрет, а угадываемый секрет означает поддельные токены. Поскольку проверка HMAC происходит локально с общим секретом, злоумышленник, перехвативший токен, может перебрать слабый ключ офлайн без ограничения частоты; инструменты вроде hashcat (режим 16500) и jwt_tool существуют именно для этого. Полноэнтропийный 32-байтный случайный ключ, напротив, вычислительно недостижим. Урок прямолинеен: никогда не используйте пароль, словарное слово или набранную вручную строку в качестве JWT-секрета — сгенерируйте случайный.

Наконец, генерация ключа на стороне клиента сама по себе является свойством безопасности. Секрет подписи никогда не должен передаваться третьей стороне, даже сайту, который помогает вам его создать. Каждый байт здесь создаётся и кодируется в вашем браузере; ничего не загружается, не логируется и не сохраняется. Когда вы готовы отправить ключ, кнопка «Копировать для .env» выдаёт строку JWT_SECRET=…, а если нужно встроить его в более крупную конфигурацию, поможет конвертер JSON в .env. Сгенерируйте, скопируйте, сохраните в менеджере секретов — и ротируйте с заголовком kid и перекрывающимися окнами действия, когда придёт время.

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

Ключевые возможности

Длина ключа с учётом алгоритма

Выберите HS256, HS384 или HS512, и генератор автоматически задаёт минимальный размер ключа по RFC 7518 §3.2 — 32, 48 или 64 байта. Можно запросить и более длинный ключ, но вы никогда случайно не выделите недоразмерный ключ, нарушающий спецификацию или который строгая библиотека откажется использовать для подписи.

Три текстобезопасных формата вывода

Получите одни и те же случайные байты как base64url (родная URL-безопасная кодировка JWT без заполнения — по умолчанию), стандартный base64 или hex, показанные рядом. base64url — самый безопасный выбор по умолчанию для JWT_SECRET; переключайте форматы, когда конкретный загрузчик или библиотека ожидают другой. Энтропия одинакова во всех трёх.

Криптографически стойкая случайность

Каждый секрет берётся из crypto.getRandomValues — CSPRNG браузера и примитива, лежащего в основе генерации ключей Web Crypto. Никогда Math.random. Это гарантирует полноэнтропийный ключ без предсказуемой структуры — свойство, которое выводит секрет за пределы офлайн-перебора.

«Копировать для .env» в один клик

«Копировать для .env» оборачивает значение в привычное присваивание JWT_SECRET=…, одна строка, без кавычек — готово для вставки в файл .env, Docker-секрет или переменную CI без ручного ввода имени ключа. Обычное «Копировать» берёт сырой секрет, когда нужно только значение.

Эквивалентные команды CLI

Панель печатает соответствующие однострочники openssl rand, Node crypto.randomBytes и Python secrets для выбранного алгоритма, чтобы вы могли воспроизвести ключ равной стойкости в скрипте подготовки или Dockerfile. Большинство конкурирующих инструментов это опускают; здесь это встроено.

Маскирование «Показать / Скрыть»

Секрет по умолчанию замаскирован, чтобы оставаться вне экрана во время демо, обучения или демонстрации экрана. Раскрывайте его иконкой глаза только когда готовы скопировать. Действия копирования всегда кладут настоящий секрет в буфер обмена, показан он или скрыт.

100% приватно, только в браузере

Секрет генерируется, кодируется и отображается целиком на вашем устройстве. Нет сетевых запросов, логирования и хранения — убедитесь в «Инструментах разработчика» → Network. Ключ подписи никогда не должен достигать третьей стороны, и здесь он этого не делает, в чём весь смысл генерации на стороне клиента.

Доступно на 15 языках

Весь интерфейс — подписи, инструкции и рекомендации — локализован на 15 языков, чтобы инструмент был удобен, а советы по безопасности ясны, где бы ни работала ваша команда.

Разобранные примеры

Сгенерировать секрет HS256 в base64url (по умолчанию)

Алгоритм: HS256 · Формат: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 подписывает с помощью HMAC-SHA-256, поэтому RFC 7518 §3.2 требует ключ не менее 32 байт (256 бит). Генератор берёт 32 криптографически стойких случайных байта из crypto.getRandomValues и кодирует их в base64url — URL-безопасный алфавит без заполнения, который использует сам JWT. 32 байта превращаются в строку base64url из 43 символов. Подставьте значение прямо в JWT_SECRET. Каждый клик создаёт свежий секрет; ничего не повторяется дважды.

Сгенерировать секрет HS512 (64 байта / 512 бит)

Алгоритм: HS512 · Формат: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 использует HMAC-SHA-512, выход хеша которого составляет 64 байта, поэтому RFC 7518 §3.2 предписывает ключ не менее 64 байт (512 бит). Инструмент распознаёт алгоритм и автоматически повышает число байтов — вам не нужно помнить минимум. 64 случайных байта кодируются в строку base64url из 86 символов, 88 символов в стандартном base64 или 128 hex-символов. Выбор более длинного алгоритма здесь — это способ в один клик выделить секрет с большей энтропией.

Скопировать секрет как строку .env

Нажмите «Копировать для .env»
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

«Копировать для .env» оборачивает сгенерированное значение в привычное присваивание JWT_SECRET=…, чтобы вы могли вставить его прямо в файл .env, Docker-секрет или переменную CI без ручного ввода имени ключа. Значение остаётся в одну строку без окружающих кавычек — ровно как ожидают загрузчики в стиле dotenv. Нужна переменная внутри более широкого конфига? Сочетайте это с конвертером JSON в .env по ссылке ниже.

Воспроизвести секрет из CLI (эквивалентная стойкость)

Показать команду CLI
openssl rand -base64 32

Панель CLI печатает команды openssl, Node и Python, которые берут то же число стойких случайных байтов для выбранного алгоритма — openssl rand -base64 32 для HS256, …48 для HS384, …64 для HS512. Вывод — это секрет равной стойкости, а не побайтово идентичная строка: openssl выдаёт стандартный base64 с заполнением, тогда как этот инструмент по умолчанию использует base64url, поэтому алфавиты и завершающие символы различаются. Используйте то, что подходит вашему скрипту подготовки; энтропия одинакова.

Показать и скрыть секрет

Переключите иконку глаза
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

Секрет по умолчанию замаскирован, поэтому его нельзя подсмотреть из-за плеча или захватить при записи экрана во время демо или демонстрации экрана. Нажмите иконку глаза, чтобы раскрыть его, когда будете готовы скопировать, и снова скройте после. «Копировать» и «Копировать для .env» работают независимо от того, показано значение или замаскировано, — в буфер обмена всегда попадает настоящий секрет, никогда точки.

Как пользоваться генератором JWT-секрета

  1. 1

    Выберите алгоритм подписи

    Выберите HS256, HS384 или HS512. Генератор мгновенно применяет минимальную длину ключа по RFC 7518 §3.2 для этого HMAC-варианта — 32, 48 или 64 байта — чтобы вам не приходилось искать число или рисковать ключом недостаточного размера.

  2. 2

    Выберите формат вывода

    base64url — по умолчанию: родная URL-безопасная кодировка JWT без заполнения. Переключитесь на стандартный base64, если его ожидает загрузчик, или на hex, когда система принимает только символы 0–f. Все три кодируют одни и те же случайные байты с одинаковой энтропией.

  3. 3

    Раскройте и скопируйте секрет

    Секрет по умолчанию замаскирован, чтобы держать его вне экрана во время демо или демонстрации экрана. Нажмите иконку глаза, чтобы раскрыть его, затем «Копировать» для сырого значения или «Копировать для .env», чтобы скопировать строку JWT_SECRET=…, готовую для файла .env или переменной CI.

  4. 4

    Генерируйте заново по необходимости

    Нажмите «Сгенерировать заново» для свежего независимого секрета из crypto.getRandomValues. Создавайте по одному на окружение — никогда не используйте один и тот же ключ подписи в разработке, стейджинге и продакшене.

  5. 5

    Используйте эквивалент CLI или переходите к подписи

    Панель CLI показывает соответствующие однострочники openssl, Node и Python для скриптовой подготовки. С секретом на руках подпишите токен JWT-кодировщиком и подтвердите подпись JWT-декодером.

Частые ошибки с JWT-секретом

Использовали пароль или короткую фразу как секрет

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

✗ Неверно
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ Верно
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

Ключ короче, чем требует алгоритм

RFC 7518 §3.2 предписывает HMAC-ключ не короче выхода хеша. 16-байтный ключ для HS256 ниже порога в 32 байта — он ослабляет подпись, и некоторые библиотеки отвергают его сразу.

✗ Неверно
16-byte key with HS256  →  below the 32-byte minimum
✓ Верно
32-byte key with HS256  →  meets RFC 7518 §3.2

Сгенерировали ключ с помощью Math.random

Math.random не криптографически стоек — его выход предсказуем, поэтому построенный на нём секрет угадываем, а подписанные им токены поддельны. Ключ подписи должен браться из CSPRNG вроде crypto.getRandomValues.

✗ Неверно
Math.random()-based key  →  predictable, unsafe
✓ Верно
crypto.getRandomValues key  →  full entropy

Перекодировали секрет перед подписью

Храните и передавайте точную строку, которую выдал инструмент. Декодирование base64 в байты в одном сервисе, но трактовка её как буквальной строки в другом дают двум сторонам разные ключи, и каждая проверка подписи проваливается.

✗ Неверно
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ Верно
Both services use the identical stored string  →  signatures verify

Переиспользовали один секрет во всех окружениях

Один JWT_SECRET, общий для dev, стейджинга и продакшена, означает, что утечка где угодно подделывает токены везде, а ротация становится «всё или ничего». Выделяйте отдельный секрет на каждое окружение.

✗ Неверно
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ Верно
A unique secret per environment  →  blast radius contained

Доверились полю alg токена при проверке

Если проверяющий принимает любой алгоритм, заявленный токеном, это включает подделки alg:none и путаницы HS/RS. Передавайте явный белый список алгоритмов, каким бы стойким ни был секрет.

✗ Неверно
jwt.verify(token, secret)  →  accepts the token's alg
✓ Верно
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

Кто пользуется этим инструментом

Выделить JWT_SECRET для нового сервиса
Поднимаете API, выпускающий токены с HMAC-подписью? Выберите алгоритм вашей библиотеки, скопируйте секрет как строку JWT_SECRET=… и поместите в окружение сервиса. Создавайте отдельный ключ для разработки, стейджинга и продакшена — никогда не делите один секрет между окружениями.
Ротировать скомпрометированный или устаревший секрет
Когда ключ заподозрен в утечке или просто пора ротировать, сгенерируйте свежий секрет здесь, присвойте ему новый kid и выкатывайте с окном перекрытия, чтобы активные токены продолжали проходить проверку до истечения. При подтверждённой компрометации ротируйте немедленно и уберите старый ключ из набора принимаемых.
Заменить слабый или набранный вручную ключ
Достался код, у которого JWT_SECRET — короткая фраза или скопированное примерное значение? Такой ключ перебираем офлайн. Сгенерируйте полноэнтропийную 32-байтную замену, подмените её за окном ротации и закройте дыру подделки токенов, пока её не использовали.
Скриптовать генерацию ключа в пайплайне
Нужно создать ключ в CI или Dockerfile, а не вручную? Используйте однострочник openssl, Node или Python с панели CLI, чтобы выпустить секрет равной стойкости внутри скрипта подготовки, а эту страницу — чтобы понять длины в байтах и кодировки, которые выдаёт каждая команда.
Безопасно обучать подписи JWT
Проведите команду через работу HS256, ни разу не раскрыв настоящий боевой ключ — сгенерируйте одноразовый секрет на экране (замаскированный, пока вы его не раскроете), подпишите образцовый токен JWT-кодировщиком и проверьте его JWT-декодером, чтобы весь цикл подписи и проверки был на виду.
Сравнить размеры ключей HS256, HS384 и HS512
Решаете, на каком HMAC-варианте стандартизироваться? Переключайтесь между алгоритмами, чтобы увидеть, как растёт требуемая длина ключа и закодированная строка — 43, 64 и 86 символов base64url — и выберите компромисс «стойкость против размера токена», подходящий вашей системе, прежде чем зафиксировать его в конфиге.
Сгенерировать ключи для локальной разработки
Нужен быстрый валидный секрет, чтобы запустить локальный поток аутентификации? Сгенерируйте его в один клик, скопируйте для .env — и вы разблокированы, с настоящим CSPRNG-ключом вместо заглушки, заменить которую перед деплоем вы забудете.

Как работает генератор

crypto.getRandomValues (CSPRNG)
Секреты генерируются заполнением Uint8Array через crypto.getRandomValues — криптографически стойкий псевдослучайный генератор Web Crypto. Это тот же источник энтропии, что лежит в основе генерации ключей Web Crypto. Math.random нигде не используется — он статистически предсказуем и непригоден для любого криптографического ключа.
Подбор размера ключа по RFC 7518 §3.2
Число байтов на алгоритм следует требованию JSON Web Algorithms, чтобы HMAC-ключ был не меньше выхода хеша: 32 байта для HS256 (SHA-256), 48 для HS384 (SHA-384), 64 для HS512 (SHA-512). Выбор алгоритма задаёт минимум; генератор не выдаст ключ ниже порога спецификации.
Кодировки RFC 4648 (base64url / base64 / hex)
Сырые байты кодируются алфавитами RFC 4648. base64url использует URL-безопасный алфавит без заполнения (32 байта → 43 символа), стандартный base64 использует заполнение +, / и = (→ 44 символа), а hex пишет два символа на байт (→ 64 символа). Смена формата перекодирует те же байты — лежащая в основе энтропия не меняется.
Почему base64url по умолчанию
Компоненты JWT сами закодированы в base64url, и URL-безопасный алфавит без заполнения означает, что секрет в base64url никогда не требует экранирования в заголовке, URL или файле конфига. Символы + и / стандартного base64 и завершающий = могут ломаться в этих контекстах, поэтому base64url — консервативный выбор по умолчанию для JWT_SECRET.
Форматирование «Копировать для .env»
«Копировать для .env» выдаёт JWT_SECRET= в одну строку без окружающих кавычек — форма, которую загрузчики в стиле dotenv разбирают без изменений. Сырой секрет никогда не содержит символов, требующих кавычек в файле .env, поэтому строку безопасно вставлять как есть.
Команды CLI равной стойкости, не побайтово идентичные
Команды панели CLI openssl rand -base64 N, Node randomBytes(N).toString('base64url') и Python secrets.token_urlsafe(N) все берут N стойких случайных байтов для выбранного алгоритма. Они создают ключи равной стойкости, а не одну и ту же строку — openssl выдаёт дополненный стандартный base64, поэтому алфавит и завершающие символы отличаются от base64url по умолчанию этого инструмента.

Лучшие практики JWT-секрета

Сопоставьте длину ключа алгоритму
Используйте не менее 32 байт для HS256, 48 для HS384 и 64 для HS512, как требует RFC 7518 §3.2. Этот генератор делает это за вас, но если вы подбираете размер ключа вручную, никогда не опускайтесь ниже длины выхода хеша — недоразмерный HMAC-ключ и ослабляет подпись, и может быть отвергнут строгими библиотеками.
Всегда генерируйте через CSPRNG, никогда из пароля
JWT-секрет — это машинное учётное данное, которое никому не нужно запоминать, поэтому тратьте полную энтропию: используйте криптографически стойкий случайный ключ, а не парольную фразу, словарное слово или набранную вручную строку. Выбранные человеком секреты — самая лёгкая цель для офлайн-атак перебором, которые автоматизируют инструменты взлома JWT.
Используйте уникальный секрет на каждое окружение
У разработки, стейджинга и продакшена должен быть свой JWT_SECRET. Совместное использование одного ключа означает, что утечка в маловажном окружении подделывает токены везде, и делает ротацию «всё или ничего». Сгенерируйте отдельный секрет здесь для каждого окружения и храните каждый в своей области менеджера секретов.
Фиксируйте алгоритм при проверке
На стороне проверки всегда передавайте явный белый список алгоритмов — algorithms: ['HS256'] в jsonwebtoken, algorithms=["HS256"] в PyJWT — и никогда не доверяйте полю alg внутри токена. Принятие самозаявленного алгоритма токена включает классические атаки путаницы алгоритмов и подделки alg:none, какой бы стойкий ни был ваш секрет.
Ротируйте с заголовком kid и перекрывающимися ключами
Помечайте подписанные токены идентификатором ключа (kid) и публикуйте активные ключи через эндпоинт JWKS, чтобы ротировать без простоя: подписывайте новые токены новым ключом, продолжая принимать старый, пока его токены не истекут. При подозрении на компрометацию пропустите перекрытие и отзовите старый ключ немедленно.

Частые вопросы

Отправляется ли сгенерированный JWT-секрет на ваш сервер?
Нет. Секрет генерируется целиком в вашем браузере с помощью crypto.getRandomValues — криптографически стойкого генератора случайных чисел платформы. Байты создаются на вашем устройстве, кодируются локально и показываются только вам. Ничего не загружается, не логируется, не записывается на диск и не отправляется третьим лицам — откройте «Инструменты разработчика» → Network, и вы увидите ноль запросов при нажатии «Сгенерировать заново» или «Копировать». Это значит, что сгенерированный здесь ключ принадлежит только вам с момента появления; ни один сервер его не видит. В этом весь смысл генерации секрета подписи на стороне клиента, а не на сайте, который в принципе мог бы хранить копию каждого выданного ключа.
Как сгенерировать безопасный JWT-секрет?
Три шага. Сначала выберите алгоритм подписи, который использует ваше приложение — HS256, HS384 или HS512 — и генератор сразу подбирает размер ключа под минимум RFC 7518 §3.2 для этого варианта (32, 48 или 64 байта), так что вы никогда не подбираете число вручную и не рискуете получить ключ недостаточного размера. Затем оставьте кодировку base64url (родной URL-безопасный формат JWT) или переключитесь на base64 или hex, если ваш загрузчик конфигурации ожидает один из них. И наконец нажмите «Копировать» — или «Копировать для .env», чтобы получить готовую к вставке строку JWT_SECRET=… — и сохраните значение в менеджере секретов или переменной окружения, никогда в системе контроля версий. Поскольку каждый байт берётся из crypto.getRandomValues, 32-байтный ключ уже несёт 256 бит энтропии, что далеко за пределами офлайн-атак перебором, которые ломают секреты, выбранные человеком. Предпочитаете командную строку? Инструмент также печатает эквивалентные однострочники openssl, Node и Python, которые можно вставить в терминал.
Какой длины должен быть JWT-секрет для HS256?
Не менее 32 байт (256 бит). RFC 7518 §3.2 — спецификация JSON Web Algorithms — гласит, что для HMAC-подписей «ДОЛЖЕН использоваться ключ того же размера, что и выход хеша (например, 256 бит для HS256), или больше». HS256 подписывает с помощью HMAC-SHA-256 (256-битный хеш), поэтому минимальный ключ — 32 байта; HS384 использует HMAC-SHA-384 и требует не менее 48 байт (384 бита); HS512 использует HMAC-SHA-512 и требует не менее 64 байт (512 бит). Этот генератор выбирает правильный минимум автоматически при выборе алгоритма, а вы можете запросить и более длинный ключ. Ключ короче — не просто слабее: он нарушает спецификацию, и некоторые библиотеки откажутся им подписывать.
В чём разница между base64url, base64 и hex и что выбрать?
Все три кодируют одни и те же случайные байты; различаются они только алфавитом символов, а не энтропией. base64url — родная кодировка JWT — использует URL-безопасный алфавит (- и _ вместо + и /) и опускает заполнение, поэтому его никогда не нужно экранировать в токене, URL или заголовке. Поэтому он по умолчанию здесь. Стандартный base64 использует +, / и заполнение =; выбирайте его, когда загрузчик конфигурации или библиотека явно ожидают классический base64. hex (base16) пишет каждый байт как два символа 0–f, создавая более длинную, но однозначную строку, удобную, когда система отвергает неалфавитно-цифровые символы. Для переменной окружения JWT_SECRET base64url — самый безопасный выбор по умолчанию; любой из трёх работает, пока вы храните точную строку и передаёте её в библиотеку подписи без изменений.
Можно ли взломать слабый JWT-секрет?
Да — и это самый большой риск для JWT, подписанных HMAC. Поскольку HS256/384/512 используют один общий секрет, любой, у кого есть токен, может запустить офлайн-атаку перебором или по словарю против подписи без ограничения частоты и без обращения к серверу. Инструменты вроде hashcat (режим 16500 нацелен на JWT) и jwt_tool созданы именно для этого; на массовых GPU секрет с низкой энтропией обычно падает за секунды-часы, а словарное слово или утёкший пароль — почти мгновенно. Полноэнтропийный 32-байтный случайный ключ из этого генератора далеко за пределами перебора. Как только злоумышленник восстановит секрет, он сможет подделать любой токен — в том числе заявляющий права администратора — поэтому стойкость секрета не опциональна. Генерируйте ключ подписи с помощью CSPRNG, никогда строкой, выбранной человеком. Подробнее об атаках на слабый секрет, путаницу алгоритмов и повтор токенов см. наше руководство по лучшим практикам безопасности JWT.
Можно ли использовать пароль в качестве JWT-секрета?
Можно, но не стоит. Запоминаемый человеком пароль — даже длинная парольная фраза — несёт куда меньше энтропии, чем 32 случайных байта, что делает его реальной целью для офлайн-атак перебором и по словарю, описанных выше. JWT-секреты — это учётные данные машина-машина; их никому не нужно запоминать, поэтому нет причин менять энтропию на запоминаемость. Сгенерируйте случайный секрет здесь, сохраните его в менеджере секретов или переменной окружения и дайте приложению его прочитать. Если вам нужны запоминаемые учётные данные для другой цели, это работа для генератора паролей или, для хранения пользовательских паролей, односторонний хеш из генератора bcrypt — но не ключ подписи токенов.
Как ротировать JWT-секрет, не сломав активные токены?
Ротируйте с перекрытием, а не резким переключением. Добавьте идентификатор ключа (заголовок kid) к подписываемым токенам, чтобы проверяющий знал, против какого секрета сверять, и публикуйте активные ключи — обычно через эндпоинт JWKS, который читают ваши сервисы. Чтобы ротировать: сгенерируйте новый секрет здесь, начните подписывать новые токены с новым kid, продолжая принимать прежний ключ для проверки, и выводите старый ключ из эксплуатации лишь после того, как истекут все подписанные им токены. Это окно перекрытия означает, что ни одна действующая сессия не аннулируется на ходу. При подозрении на компрометацию пропустите плавное перекрытие: ротируйте немедленно, уберите старый ключ из набора принимаемых и принудительно перевыполните аутентификацию, чтобы утёкшие токены сразу перестали проходить проверку.
Чем ключ HMAC (HS*) отличается от ключа RSA или ECDSA (RS*/ES*)?
Они решают одну задачу с противоположными моделями ключей. HS256/384/512 — это HMAC-алгоритмы: они используют один симметричный секрет — такой, как создаёт этот инструмент, — который и подписывает, и проверяет, поэтому любая сторона, способная проверить токен, способна и подделать его. Это просто, быстро и идеально, когда один сервис и выпускает, и проверяет собственные токены. RS* (RSA) и ES* (ECDSA) асимметричны: они используют пару ключей, где закрытый ключ подписывает, а отдельный открытый ключ только проверяет. Открытый ключ можно передать всем, кому нужно проверять токены, ни разу не раскрывая ключ подписи, — правильный выбор, когда провайдер идентификации выпускает токены, которые проверяют многие независимые сервисы. Этот генератор создаёт только симметричные HMAC-секреты. Чтобы собрать и подписать настоящий токен сгенерированным ключом, используйте JWT-кодировщик; чтобы осмотреть и проверить токен, используйте JWT-декодер.

Похожие инструменты

Все инструменты →

Генератор и проверка bcrypt-хешей

Безопасность

Создавайте и проверяйте bcrypt-хеши паролей онлайн — настраиваемый фактор стоимости, префиксы $2b$/$2a$/$2y$. 100% в браузере; пароль никуда не отправляется.

Декодер JWT

Безопасность

Декодируйте JWT-токены онлайн бесплатно. Просмотр header, payload, signature, срока действия, алгоритма и claims. 100% в браузере — токен не покидает устройство. Без регистрации.

JWT-энкодер и генератор

Безопасность

Бесплатный онлайн-генератор и энкодер JWT. Соберите header и payload, подпишите с HS256, RS256 или ES256 мгновенно. 100% в браузере — ваш секрет и ключ не покидают устройство.

Генератор MD5-хешей и контрольных сумм файлов

Безопасность

Создавайте MD5, SHA-256, SHA-1 и SHA-512 хеши онлайн бесплатно. Хеширование текста или файлов в браузере, проверка контрольных сумм и копирование результатов. Без регистрации.

Генератор случайных паролей — настраиваемый и безопасный

Безопасность

Генерируйте сильные случайные пароли мгновенно — бесплатно, 100% в браузере. Настройка длины и символов, batch до 50 с анализом энтропии.

Генератор SHA-1 хешей (160-бит, устаревший)

Безопасность

Получайте SHA-1 хеши в браузере — 40-символьный hex-вывод, без загрузки на сервер. Устаревший инструмент для отпечатков Git, проверки старых сертификатов и аудита миграции.