Все записи
ВыпущеноБезопасность

JWKS и шифрование данных: как мы защищаем ваши данные

Команда SEG-T·Разработка
11 апреля 2026 г.

Привет! Сегодня поговорим о теме, которая редко попадает в маркетинговые материалы, но от которой зависит буквально всё — криптография и защита данных в SEG-T. Расскажем, что такое JWKS, как устроена аутентификация, какие подходы к шифрованию мы используем и почему — всё простым языком, но без потери смысла.

Статья написана для тех, кто хочет понять, как SEG-T защищает данные, но не хочет читать RFC-стандарты на 80 страниц. Мы объясняем принципы и подходы, а не внутреннюю реализацию — потому что прозрачность в безопасности означает открытость о том, что мы делаем, а не о том, как именно это устроено внутри.

Почему криптография — это фундамент

SEG-T — это система безопасности, через которую проходит корпоративная почта целых организаций. Это накладывает особые требования:

  • Доверие клиентов — организации передают нам контроль над почтовым трафиком. Если мы не можем защитить собственную инфраструктуру — мы не имеем права защищать чужую
  • Регуляторные требования — 152-ФЗ о персональных данных обязывает применять криптографические средства защиты при обработке и хранении ПДн
  • Микросервисная архитектура — множество сервисов общаются друг с другом, и каждый канал связи должен быть защищён. Компрометация одного сервиса не должна ставить под угрозу всю систему
  • Высокая ценность данных — email-контент, учётные данные, ключи интеграций — всё это привлекательные цели для злоумышленников

Криптография в SEG-T — это не «галочка для аудита», а фундамент архитектуры. Каждое решение о том, как хранить, передавать и проверять данные, начинается с вопроса: «Как это защищено?»

Два вида криптографии: симметричная и асимметричная

Прежде чем разбираться в JWKS и JWT, нужно понять два базовых подхода к криптографии, потому что SEG-T использует оба — каждый для своих задач.

Симметричная

Один ключ для шифрования и расшифровки. Как замок с одним ключом — кто может закрыть, тот может и открыть. Быстрая, но ключ нужно как-то безопасно передать второй стороне.

Используем для: шифрования данных в базе

Асимметричная

Два ключа — приватный и публичный. Приватный подписывает, публичный проверяет подпись. Публичный ключ можно раздать всем — это безопасно.

Используем для: подписи и проверки JWT-токенов

Аналогия: симметричная криптография — это сейф с одним ключом: кто имеет ключ, тот владеет сейфом. Асимметричная — это почтовый ящик: щель для писем (публичный ключ) доступна всем, но открыть ящик и прочитать письма может только владелец (приватный ключ).

JWT — цифровой пропуск пользователя

JWT (JSON Web Token) — это компактный токен, который сервер выдаёт пользователю после успешной аутентификации. По сути это строка из трёх частей, разделённых точками:

Header

Метаданные — какой алгоритм используется для подписи и идентификатор ключа (kid)

Payload

Полезная нагрузка — информация о пользователе и срок действия токена. Эти данные НЕ зашифрованы — они закодированы в Base64

Signature

Цифровая подпись — гарантирует, что header и payload не были изменены после выдачи. Создаётся приватным ключом

Важный момент: JWT не шифрует данные пользователя. Payload можно декодировать и прочитать — это обычный Base64. Задача JWT — не скрыть информацию, а гарантировать её целостность. Подпись доказывает, что токен был выдан нашей системой и никто не менял его содержимое.

Почему payload не зашифрован?

Потому что JWT нужен для авторизации, а не для передачи секретов. В payload лежат только минимально необходимые данные для принятия решений о доступе. Чувствительные данные (пароли, ключи) никогда не попадают в JWT.

JWKS — реестр публичных ключей

JWKS (JSON Web Key Set) — это стандартный формат для публикации криптографических ключей, описанный в RFC 7517. Проще говоря, это JSON-документ, в котором лежат публичные ключи для проверки подписей JWT-токенов.

Когда пользователь логинится, сервис аутентификации подписывает JWT приватным ключом. Когда этот же пользователь обращается к другому микросервису — тот должен проверить подпись. Для этого ему нужен публичный ключ. Вопрос: где его взять?

Вариантов несколько: вшить в конфиг каждого сервиса (плохо — нельзя ротировать), передавать через переменные окружения (лучше, но всё равно не гибко) или раздавать через стандартный API-эндпоинт. Мы выбрали третий вариант — JWKS-эндпоинт. Это стандартный подход, который используют все крупные провайдеры идентификации.

Аналогия: представьте, что JWT — это паспорт с печатью, а JWKS — это реестр образцов печатей в пункте контроля. Любой пограничник (микросервис) может свериться с реестром и убедиться, что печать настоящая — не обращаясь каждый раз к тому, кто выдал паспорт.

Каждый ключ в JWKS имеет уникальный идентификатор — kid (Key ID). Этот же kid записывается в header JWT-токена. Благодаря этому микросервис точно знает, каким ключом проверять подпись — даже если в JWKS лежат несколько ключей одновременно (а это важно для ротации, о которой расскажем ниже).

Как работает аутентификация в SEG-T

Теперь, когда мы разобрались с компонентами, посмотрим, как всё это работает вместе. Аутентификация в SEG-T построена на асимметричной криптографии. Вот общий flow:

1

Пользователь вводит логин и пароль

Запрос приходит на сервис аутентификации по защищённому каналу. Сервис проверяет учётные данные пользователя. Если всё корректно — пользователь аутентифицирован.

2

Сервер генерирует JWT-токен

В токен записывается информация о пользователе и его правах. Токен подписывается приватным ключом, доступным только сервису аутентификации.

3

Токен отправляется клиенту

Токены имеют ограниченный срок жизни. Система автоматически обновляет сессию, не требуя повторного ввода пароля. Это ограничивает ущерб при утечке токена.

4

Клиент отправляет запросы с токеном

При каждом запросе к API токен передаётся в заголовке. Микросервис извлекает его и начинает проверку — самостоятельно, без обращения к сервису аутентификации.

5

Микросервис проверяет подпись через JWKS

Сервис находит нужный публичный ключ в JWKS по идентификатору из токена и проверяет подпись.

6

Проверка прав доступа

Если подпись валидна и токен не истёк — проверяются права пользователя на запрашиваемый ресурс. Только после всех проверок запрос обрабатывается.

Такой подход обеспечивает высокую производительность и отказоустойчивость — микросервисы проверяют токены самостоятельно через публичные ключи, не создавая узких мест в системе.

Почему асимметричная подпись, а не симметричная

При выборе алгоритма подписи для JWT стоит ключевой вопрос: симметричный или асимметричный? Разница критична для микросервисной архитектуры:

Симметричный подход

Один и тот же секрет используется и для подписи, и для проверки. Это значит, что каждый микросервис, который проверяет токены, должен знать секрет. А кто знает секрет — тот может создавать поддельные токены.

Асимметричный подход

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

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

Ротация ключей: зачем и как

Даже самый надёжный ключ не должен использоваться вечно — это фундаментальный принцип криптографии. Причин несколько:

  • Ограничение ущерба — если приватный ключ когда-либо утечёт, злоумышленник сможет подписывать поддельные токены. Регулярная ротация ограничивает окно, в котором скомпрометированный ключ может быть использован
  • Криптографическая гигиена — чем дольше используется ключ, тем больше подписей с ним создано. Периодическая замена снижает теоретические риски
  • Compliance — стандарты безопасности (PCI DSS, SOC 2 и др.) требуют регулярной ротации криптографических ключей

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

1.Генерация новой пары криптографических ключей
2.Новый публичный ключ добавляется в JWKS (теперь там два ключа)
3.Новые токены подписываются новым приватным ключом
4.Grace period — старые токены проверяются старым ключом из JWKS
5.Пользователи постепенно получают новые токены через refresh
6.После завершения grace period старый ключ удаляется из JWKS

Ключевой механизм — поле kid (Key ID). Каждый JWT-токен содержит идентификатор ключа, которым он подписан. Микросервис смотрит kid, находит соответствующий публичный ключ в JWKS и проверяет подпись. Даже если в JWKS лежат несколько ключей одновременно — конфликта не будет, каждый токен знает «свой» ключ.

Многослойная защита данных

Аутентификация через JWT и JWKS — это про «кто ты?». Но не менее важен вопрос «как защищены данные?». В SEG-T мы применяем модель defense in depth — многослойную защиту, где каждый уровень страхует предыдущий. Если один слой скомпрометирован — остальные продолжают защищать данные.

Уровень 1: Шифрование при передаче

Каждый байт данных, передаваемый между компонентами системы, зашифрован с помощью актуальной версии TLS. Но защита распространяется не только на внешний трафик:

  • Клиент → Сервер — весь HTTPS-трафик между браузером и нашим API
  • Сервис → Сервис — внутренняя коммуникация между микросервисами также зашифрована
  • Сервис → Хранилища — подключения к хранилищам данных также защищены шифрованием

Мы используем только актуальные версии TLS с современными cipher suites, исключая устаревшие и скомпрометированные алгоритмы.

Уровень 2: Шифрование при хранении

Все данные в базе данных зашифрованы на уровне хранилища. Это означает, что физические диски содержат только зашифрованные блоки.

Зачем это нужно? Представьте сценарий: злоумышленник получает физический доступ к серверу или его резервной копии. Без шифрования на уровне хранилища он просто скопирует файлы базы данных и прочитает всё. С шифрованием — он получит бессмысленный набор байтов.

Ключи шифрования хранилища управляются отдельно от приложения и ротируются автоматически — это дополнительный уровень изоляции.

Уровень 3: Шифрование отдельных полей

Шифрование при хранении — важный, но не единственный уровень защиты. Для особо чувствительных полей мы применяем дополнительное шифрование на уровне приложения — ещё один независимый барьер.

Что это даёт

  • Чувствительные поля зашифрованы даже «внутри» базы
  • Компрометация одного сервиса не раскрывает все секреты
  • Подмена зашифрованных данных в базе обнаруживается
  • Доступ к расшифровке — только у сервисов, которым это нужно

Наш подход

  • Authenticated encryption — целостность + конфиденциальность
  • Невозможность подбора ключа вычислительными методами
  • Аппаратное ускорение для минимальной задержки
  • Стандарт, рекомендованный NIST

Важная деталь: мы используем authenticated encryption — режим, который обеспечивает не только конфиденциальность, но и целостность данных. При расшифровке проверяется, были ли данные изменены после шифрования. Если злоумышленник модифицирует зашифрованное поле в базе — расшифровка провалится, и мы это сразу обнаружим.

Уровень 4: Хеширование паролей

Пароли — особый случай. Их не нужно расшифровывать — нужно только проверять. Поэтому вместо шифрования мы используем одностороннее хеширование: из пароля создаётся хеш, из которого невозможно восстановить исходный пароль.

Мы используем современный адаптивный алгоритм хеширования, специально спроектированный для паролей. Вот почему это принципиально:

Намеренная медлительность

Алгоритм спроектирован так, чтобы быть медленным. Это незаметно для пользователя при обычном логине, но делает перебор миллионов паролей непрактичным.

Уникальная соль для каждого пароля

Алгоритм автоматически генерирует уникальную «соль» при хешировании. Даже если два пользователя выберут одинаковый пароль — их хеши будут разными. Это защищает от атак с предвычисленными таблицами.

Адаптивность к росту вычислительных мощностей

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

Почему не обычный хеш? Быстрые хеш-функции общего назначения не предназначены для паролей — они оптимизированы на скорость, что играет на руку атакующему. Адаптивные алгоритмы для паролей на порядки медленнее, что делает перебор вычислительно непрактичным.

Безопасное хранение ключей

Алгоритмы — это только половина дела. Если ключи хранятся неправильно, даже самый надёжный алгоритм бесполезен. Вот принципы, которым мы следуем:

Выделенное хранилище секретов

Все криптографические ключи хранятся в специализированном хранилище секретов с полным аудит-логом каждого обращения. Ключи никогда не попадают в код, git-историю, конфиги или логи.

Публичные ключи — через стандартный протокол

Публичные ключи раздаются через JWKS-эндпоинт в соответствии с RFC 7517. Это стандартный подход, используемый всеми крупными провайдерами — от облачных платформ до корпоративных SSO.

Разделение ключей по назначению

Разные задачи используют разные ключи с разными политиками доступа. Компрометация одного ключа не затрагивает остальные.

Безопасная доставка секретов

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

Принцип минимальных привилегий

Один из ключевых архитектурных принципов — каждый компонент системы получает доступ только к тем ключам и секретам, которые ему необходимы для работы. Ни больше, ни меньше.

Если скомпрометирован один компонент — последствия ограничены только тем, к чему этот компонент имел доступ. Остальные части системы остаются защищёнными.

Изоляция по дизайну

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

Безопасность — это процесс, а не состояние

Мы постоянно пересматриваем и улучшаем криптографическую инфраструктуру. Если у вас есть вопросы — пишите в поддержку, мы всегда готовы ответить.

В будущих записях дневника продолжим рассказывать о других интересных аспектах работы SEG-T — следите за обновлениями!

Дневник разработки | SEG-T