Алгоритмы подписи
CyberGo JWT поддерживает 4 типа, всего 12 алгоритмов подписи, охватывающих все сценарии от монолитных приложений до микросервисной архитектуры.
Обзор алгоритмов
| Тип | Алгоритмы | Тип ключа | Сценарий использования |
|---|---|---|---|
| HMAC | HS256 / HS384 / HS512 | Симметричный ключ | Монолитные приложения, простые сервисы |
| RSA | RS256 / RS384 / RS512 | Публичный/приватный ключ | Микросервисы, проверка на нескольких сервисах |
| RSA-PSS | PS256 / PS384 / PS512 | Публичный/приватный ключ | Микросервисы (рекомендуемая замена RSA) |
| ECDSA | ES256 / ES384 / ES512 | Публичный/приватный ключ | Высокопроизводительные микросервисы |
HMAC (симметричный ключ)
HMAC использует один и тот же ключ для подписи и проверки — это самое простое решение.
Требования к ключу
- Минимум 32 байта
- Библиотека автоматически обнаруживает слабые ключи (например, состоящие из повторяющихся символов, простых последовательностей)
Использование
cfg := jwt.DefaultConfig()
cfg.SecretKey = "hmac-key-that-has-at-least-32-bytes!"
cfg.SigningMethod = jwt.SigningMethodHS256 // Значение по умолчанию, можно опуститьВыбор алгоритма
| Константа | Алгоритм | Описание |
|---|---|---|
SigningMethodHS256 | HMAC-SHA256 | Рекомендуется, баланс производительности и безопасности |
SigningMethodHS384 | HMAC-SHA384 | Более высокая безопасность |
SigningMethodHS512 | HMAC-SHA512 | Максимальная безопасность |
Рекомендация
Для большинства сценариев достаточно HS256. Рекомендуется использовать криптографически безопасный случайный ключ длиной не менее 32 байт.
RSA (асимметричный ключ)
RSA использует приватный ключ для подписи и публичный для проверки. Подходит для сценариев, где проверяющей стороне не нужно владеть приватным ключом.
Использование
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodRS256
cfg.SigningKey = rsaPrivateKey // *rsa.PrivateKey
cfg.VerificationKey = rsaPublicKey // *rsa.PublicKey (необязательно)Ключ проверки
VerificationKey необязателен. Если не установлен, библиотека использует SigningKey для проверки (извлекает публичный ключ из приватного).
Генерация ключей
// Генерация 2048-битной пары RSA-ключей
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
publicKey := &privateKey.PublicKeyВыбор алгоритма
| Константа | Алгоритм | Описание |
|---|---|---|
SigningMethodRS256 | RSA-SHA256 | Рекомендуется |
SigningMethodRS384 | RSA-SHA384 | Более высокая безопасность |
SigningMethodRS512 | RSA-SHA512 | Максимальная безопасность |
RSA-PSS (асимметричный ключ, рекомендуется вместо RSA)
RSA-PSS — улучшенная схема подписи RSA, использующая заполнение вероятностной схемы подписи (PSS). Безопаснее PKCS#1 v1.5. Ключи те же, что и для RSA.
Использование
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodPS256
cfg.SigningKey = rsaPrivateKey // *rsa.PrivateKey (совместим с ключами RSA)
cfg.VerificationKey = rsaPublicKey // *rsa.PublicKey (необязательно)Рекомендуемая замена
RSA-PSS безопаснее RSA PKCS#1 v1.5. Рекомендуется использовать алгоритмы RSA-PSS в новых проектах. Ключи полностью идентичны RSA, дополнительная генерация не требуется.
Выбор алгоритма
| Константа | Алгоритм | Описание |
|---|---|---|
SigningMethodPS256 | RSA-PSS-SHA256 | Рекомендуется |
SigningMethodPS384 | RSA-PSS-SHA384 | Более высокая безопасность |
SigningMethodPS512 | RSA-PSS-SHA512 | Максимальная безопасность |
ECDSA (эллиптическая кривая)
ECDSA — также асимметричный алгоритм, но с более короткими ключами и лучшей производительностью.
Использование
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodES256
cfg.SigningKey = ecdsaPrivateKey // *ecdsa.PrivateKey
cfg.VerificationKey = ecdsaPublicKey // *ecdsa.PublicKey (необязательно)Генерация ключей
// Генерация пары ключей на кривой P-256
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
log.Fatal(err)
}
publicKey := &privateKey.PublicKeyВыбор алгоритма
| Константа | Алгоритм | Кривая | Описание |
|---|---|---|---|
SigningMethodES256 | ECDSA-SHA256 | P-256 | Рекомендуется |
SigningMethodES384 | ECDSA-SHA384 | P-384 | Более высокая безопасность |
SigningMethodES512 | ECDSA-SHA512 | P-521 | Максимальная безопасность |
Как выбрать
Монолитное приложение ──────→ HMAC
Микросервисы (одна область доверия) ──→ HMAC
Микросервисы (кросс-сервисная проверка) → RSA, RSA-PSS или ECDSA
Приоритет безопасности ─────→ RSA-PSS (замена RSA)
Высокие требования к производительности → ECDSA
Чувствительность к длине ключа ─→ ECDSA| Фактор | HMAC | RSA | RSA-PSS | ECDSA |
|---|---|---|---|---|
| Скорость подписи | Быстрая | Медленнее | Медленнее | Быстрая |
| Скорость проверки | Быстрая | Быстрая | Быстрая | Быстрая |
| Длина ключа | 32+ байта | 2048+ бит | 2048+ бит | 256+ бит |
| Длина подписи | Фиксированная | Длинная (~256 байт) | Длинная (~256 байт) | Короткая (~64 байта) |
| Архитектурная связанность | Тесная | Слабая | Слабая | Слабая |
| Безопасность | Высокая | Высокая | Более высокая | Высокая |
Меры безопасности
Запрещено
- Не храните ключи в коде (hardcode)
- Не используйте слабые ключи (только цифры, повторяющиеся символы и т.д.)
- Не используйте алгоритм
none(библиотека автоматически отклоняет) - HMAC-ключ не должен быть короче 32 байт
Лучшие практики
- Используйте переменные окружения или сервисы управления ключами для хранения ключей
- Регулярно ротируйте ключи подписи
- В производственной среде рекомендуется использовать RSA или ECDSA
- RSA-ключи рекомендуется использовать размером от 2048 бит
Дальнейшие шаги
- Пользовательские Claims — определение бизнес-полей
- Справочник API → Функции пакета — полные сигнатуры API
- Базовые примеры — полный пример HMAC