Skip to content

Алгоритмы подписи

CyberGo JWT поддерживает 4 типа, всего 12 алгоритмов подписи, охватывающих все сценарии от монолитных приложений до микросервисной архитектуры.

Обзор алгоритмов

ТипАлгоритмыТип ключаСценарий использования
HMACHS256 / HS384 / HS512Симметричный ключМонолитные приложения, простые сервисы
RSARS256 / RS384 / RS512Публичный/приватный ключМикросервисы, проверка на нескольких сервисах
RSA-PSSPS256 / PS384 / PS512Публичный/приватный ключМикросервисы (рекомендуемая замена RSA)
ECDSAES256 / ES384 / ES512Публичный/приватный ключВысокопроизводительные микросервисы

HMAC (симметричный ключ)

HMAC использует один и тот же ключ для подписи и проверки — это самое простое решение.

Требования к ключу

  • Минимум 32 байта
  • Библиотека автоматически обнаруживает слабые ключи (например, состоящие из повторяющихся символов, простых последовательностей)

Использование

go
cfg := jwt.DefaultConfig()
cfg.SecretKey = "hmac-key-that-has-at-least-32-bytes!"
cfg.SigningMethod = jwt.SigningMethodHS256 // Значение по умолчанию, можно опустить

Выбор алгоритма

КонстантаАлгоритмОписание
SigningMethodHS256HMAC-SHA256Рекомендуется, баланс производительности и безопасности
SigningMethodHS384HMAC-SHA384Более высокая безопасность
SigningMethodHS512HMAC-SHA512Максимальная безопасность

Рекомендация

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

RSA (асимметричный ключ)

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

Использование

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodRS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey (необязательно)

Ключ проверки

VerificationKey необязателен. Если не установлен, библиотека использует SigningKey для проверки (извлекает публичный ключ из приватного).

Генерация ключей

go
// Генерация 2048-битной пары RSA-ключей
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

Выбор алгоритма

КонстантаАлгоритмОписание
SigningMethodRS256RSA-SHA256Рекомендуется
SigningMethodRS384RSA-SHA384Более высокая безопасность
SigningMethodRS512RSA-SHA512Максимальная безопасность

RSA-PSS (асимметричный ключ, рекомендуется вместо RSA)

RSA-PSS — улучшенная схема подписи RSA, использующая заполнение вероятностной схемы подписи (PSS). Безопаснее PKCS#1 v1.5. Ключи те же, что и для RSA.

Использование

go
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, дополнительная генерация не требуется.

Выбор алгоритма

КонстантаАлгоритмОписание
SigningMethodPS256RSA-PSS-SHA256Рекомендуется
SigningMethodPS384RSA-PSS-SHA384Более высокая безопасность
SigningMethodPS512RSA-PSS-SHA512Максимальная безопасность

ECDSA (эллиптическая кривая)

ECDSA — также асимметричный алгоритм, но с более короткими ключами и лучшей производительностью.

Использование

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodES256
cfg.SigningKey = ecdsaPrivateKey      // *ecdsa.PrivateKey
cfg.VerificationKey = ecdsaPublicKey  // *ecdsa.PublicKey (необязательно)

Генерация ключей

go
// Генерация пары ключей на кривой P-256
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

Выбор алгоритма

КонстантаАлгоритмКриваяОписание
SigningMethodES256ECDSA-SHA256P-256Рекомендуется
SigningMethodES384ECDSA-SHA384P-384Более высокая безопасность
SigningMethodES512ECDSA-SHA512P-521Максимальная безопасность

Как выбрать

text
Монолитное приложение ──────→ HMAC
Микросервисы (одна область доверия) ──→ HMAC
Микросервисы (кросс-сервисная проверка) → RSA, RSA-PSS или ECDSA
Приоритет безопасности ─────→ RSA-PSS (замена RSA)
Высокие требования к производительности → ECDSA
Чувствительность к длине ключа ─→ ECDSA
ФакторHMACRSARSA-PSSECDSA
Скорость подписиБыстраяМедленнееМедленнееБыстрая
Скорость проверкиБыстраяБыстраяБыстраяБыстрая
Длина ключа32+ байта2048+ бит2048+ бит256+ бит
Длина подписиФиксированнаяДлинная (~256 байт)Длинная (~256 байт)Короткая (~64 байта)
Архитектурная связанностьТеснаяСлабаяСлабаяСлабая
БезопасностьВысокаяВысокаяБолее высокаяВысокая

Меры безопасности

Запрещено

  • Не храните ключи в коде (hardcode)
  • Не используйте слабые ключи (только цифры, повторяющиеся символы и т.д.)
  • Не используйте алгоритм none (библиотека автоматически отклоняет)
  • HMAC-ключ не должен быть короче 32 байт

Лучшие практики

  • Используйте переменные окружения или сервисы управления ключами для хранения ключей
  • Регулярно ротируйте ключи подписи
  • В производственной среде рекомендуется использовать RSA или ECDSA
  • RSA-ключи рекомендуется использовать размером от 2048 бит

Дальнейшие шаги