Как сгенерировать ключ
- Выберите пресет под то, что настраиваете. При открытии страницы выбран 32 байта.
- Скопируйте значение из блока Случайные значения. У пресетов со строкой конфигурации, например Laravel или Auth.js, она дополнительно показана в блоке Готово к вставке.
- Нажмите Сгенерировать заново, чтобы получить другой ключ, или увеличьте Количество, чтобы создать сразу несколько, например по одному на каждое окружение.
Пресет сам выставляет число байтов и формат. Если поменять любое из этих полей, инструмент переключится на Свой вариант и сохранит ваши значения.
Пресеты и куда идёт каждый ключ
| Пресет | Что получается | Длина | Где обычно используется |
|---|---|---|---|
| 16 / 32 / 64 байта | случайные байты в Base64 | 24 / 44 / 88 | универсальные ключи, соли, секреты |
| Laravel APP_KEY | base64: + 32 байта | 51 | APP_KEY в .env |
| Ключ AES-128 | 16 байт, Base64 | 24 | AES-128-GCM или -CBC |
| Ключ AES-256 | 32 байта, Base64 | 44 | AES-256-GCM или -CBC |
| Секрет HMAC | 32 байта, Base64 | 44 | подпись HMAC-SHA256, вебхуки |
| Секрет JWT HS256 | 32 байта, Base64URL | 43 | JWT_SECRET для токенов HS256 |
| Секрет Auth.js | 32 байта, Base64 | 44 | AUTH_SECRET (раньше NEXTAUTH_SECRET) |
| Django SECRET_KEY | 50 символов из алфавита Django | 50 | SECRET_KEY в settings |
| Rails secret_key_base | 64 байта, hex | 128 | secret_key_base |
| API-токен | 32 байта, Base64URL | 43 | bearer-токены, ссылки-приглашения |
| UUID v4 (Base64URL) | случайный UUID в короткой записи | 22 | компактные ID; канонический UUID тоже показан |
Пресет для nonce в CSP решает другую задачу, и у него своя страница: генератор nonce для CSP.
Размеры диктуют сами алгоритмы. Ключ AES занимает ровно 16, 24 или 32 байта, любой другой отвергается. RFC 7518 требует для HS256 секрет не короче 256 бит, поэтому пресет JWT использует 32 байта. Ключ HMAC короче вывода хеш-функции ослабляет HMAC, так что 32 байта подходят для HMAC-SHA256, а пресет на 64 байта подходит для HMAC-SHA512. Пресет Django выбирает 50 символов методом отбраковки (rejection sampling), поэтому все символы алфавита равновероятны. Так же работает и собственная get_random_secret_key() в Django.
Ключ в Base64 нужно декодировать в байты
Вы копируете запись случайных байтов в Base64. Код, который её использует, должен сначала её декодировать:
import base64, os
key = base64.b64decode(os.environ["AES_KEY"])
assert len(key) == 32
В Node.js то же делает Buffer.from(process.env.AES_KEY, "base64"). Если отдать библиотеке AES строку из 44 символов как есть, она либо откажется её принимать (AESGCM key must be 128, 192, or 256 bits в Python, Invalid key length в Node.js), либо, если библиотека менее строгая, молча возьмёт не те байты. Фреймворки, которые сами читают свои ключи, например Laravel с префиксом base64:, декодируют их за вас.
Base64URL и стандартный Base64 декодируются в одни и те же байты, но парсеры часто строго принимают только один вариант. Оставляйте формат, который выдал пресет, если не уверены, что получатель понимает и другой.
Ключи Fernet и другие форматы
Пакет cryptography для Python ждёт ключ Fernet в виде 32 байтов в URL-safe Base64 с дополнением, то есть 44 символа. Пресеты JWT и API-токена дают URL-safe вариант без =, поэтому допишите его в конец или сгенерируйте ключ в Python:
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
Для всего остального отталкивайтесь от числа байтов: выберите Свой вариант, укажите столько байтов, сколько требует документация библиотеки, и выберите Base64, Base64URL или hex. На странице генератора случайного Base64 объясняется длина результата, а в HMAC в Base64 и шифровании AES свежий ключ можно сразу опробовать.
Что делать с ключом после генерации
Сгенерированный здесь ключ существует только в этой вкладке, пока вы его не скопируете. Дальше он защищён ровно настолько, насколько защищено место, куда вы его вставили. Держите боевые ключи в хранилище секретов платформы или в менеджере секретов, используйте отдельный ключ для каждого окружения и никогда не коммитьте их; ключ, попавший в Git-репозиторий, считайте публичным и заменяйте. Смена ключа шифрования означает перешифровку старых данных или хранение старого ключа для расшифровки, так что продумайте это до того, как менять APP_KEY на работающей системе.
Вопросы и ответы
Как сгенерировать ключ Base64 на 32 байта?
Пресет 32 байта выбран сразу при открытии страницы, так что в результате уже лежит такой ключ: 44 символа с = в конце. В терминале то же самое делает openssl rand -base64 32.
Можно ли взять строку Base64 из 44 символов прямо как ключ AES-256?
Нет. AES-256 нужны 32 сырых байта, а 44 символа только записывают их в Base64. Сначала декодируйте строку; если передать сам текст, получите ошибку вроде Invalid key length в Node.js.
Как получить Laravel APP_KEY без artisan?
Выберите пресет Laravel APP_KEY и скопируйте строку APP_KEY=base64:… в .env. Формат тот же, что пишет php artisan key:generate: префикс base64: и 32 случайных байта для шифра AES-256-CBC по умолчанию.
Как сделать здесь ключ Fernet?
Отдельного пресета для Fernet нет. Выберите 32 байта, в поле Формат укажите Base64URL и допишите один = к 43 символам: Fernet ждёт URL-safe Base64 с дополнением длиной 44 символа. Или запустите Fernet.generate_key() в Python.
Безопасно ли генерировать боевые ключи в браузере?
Ключ берётся из crypto.getRandomValues, криптографически стойкого генератора, а страница не может никуда его отправить. Главный риск в том, что будет дальше: храните ключ в менеджере секретов или защищённой переменной окружения и никогда не кладите в репозиторий.