Аутентифицированное шифрование с дополнительными данными (AEAD)

Примитив AEAD (аутентифицированное шифрование с присоединенными данными) – самый распространенный примитив для шифрования данных, который подходит для большинства задач.

AEAD имеет следующие свойства:

  • Secrecy О простом тексте ничего не известно, кроме его длины.
  • Подлинность. Невозможно изменить зашифрованный текст, не оставив следов.
  • Симметричное. Для шифрования и расшифровки используется один и тот же ключ.
  • Рандомизация. Шифрование выполняется случайным образом. Два сообщения с одинаковым простым текстом дают разные зашифрованные тексты. Злоумышленники не могут узнать, какой зашифрованный текст соответствует заданному простому тексту. Если вы хотите этого избежать, используйте детерминированное AEAD-шифрование.

Связанные данные

AEAD можно использовать, чтобы связать зашифрованный текст с определенными связанными данными. Предположим, у вас есть база данных с полями user-id и encrypted-medical-history. В этом случае user-id можно использовать как связанные данные при шифровании encrypted-medical-history. Это не позволяет злоумышленнику перенести историю болезни от одного пользователя к другому.

Связанные данные указывать необязательно. Если указать этот параметр, расшифровка будет успешной, только если в вызовы шифрования и расшифровки переданы одни и те же связанные данные.

Выберите тип ключа

Хотя для большинства случаев мы рекомендуем AES128_GCM, существуют различные типы ключей для разных потребностей. AES128 обеспечивает 128-битное шифрование, а AES256 – 256-битное.

При выборе режима следует учитывать два важных ограничения безопасности:

  1. Запросов в секунду: сколько сообщений зашифровано одним ключом?
  2. Размер сообщений.

Поддерживаемые типы ключей:

  • AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) с 16-байтовым вектором инициализации (IV) – наиболее консервативный режим с хорошими границами.
    • Фиксация ключа.
  • AES-EAX (AES128_EAX, AES256_EAX) – немного менее консервативный и немного более быстрый, чем AES128_CTR_HMAC_SHA256.
    • MLGR без фиксации ключа.
  • AES-GCM (AES128_GCM, AES256_GCM) – обычно самый быстрый режим с самыми строгими ограничениями на количество сообщений (232) и их размер (около 64 ГБ на сообщение). Если эти ограничения превышены, AES-GCM дает катастрофический сбой, раскрывая простой текст и часть аутентификации внутреннего ключа AES-GCM.
    • AES-GCM не является ни надежным [ABN], ни фиксирующим ключ [GLR]. Можно сгенерировать зашифрованный текст, который можно расшифровать с помощью двух разных ключей. Это может привести к атакам [DGRW]. Если ключ выбирает злоумышленник, тщательно проверьте модель угроз.
  • AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) [RFC8452] устойчив к случайному неправильному использованию одноразового кода и почти так же эффективен, как AES-GCM. Ограничения на количество и размер сообщений для AES-GCM-SIV со случайными векторами инициализации намного выше, чем для AES-GCM. При превышении этих ограничений AES-GCM-SIV дает менее катастрофический сбой: он только сообщает, что два сообщения равны. AES-GCM-SIV безопаснее, но реже используется на практике.
    • Границы для случайных одноразовых кодов:
      • 232 сообщений, где каждый простой текст не превышает 8 ГиБ.
      • 248 сообщений, где размер каждого обычного текста не превышает 32 МиБ.
      • 264 сообщений, где каждый простой текст не превышает 128 КиБ.
    • Чтобы использовать его в Java, установите Conscrypt.
    • Не фиксирует ключ ADGKLS.
  • XChaCha20-Poly1305 (XCHACHA20_POLY1305) имеет гораздо больший лимит на количество сообщений и их размер, чем AES-GCM, но в случае сбоя (что маловероятно) также происходит утечка ключевого материала. Аппаратное ускорение не используется, поэтому в ситуациях, когда оно доступно, этот режим может работать медленнее, чем режимы AES.
    • LGR без привязки ключа.

Подробнее о формате передачи зашифрованного текста AEAD…

Гарантии безопасности

Реализации AEAD предлагают:

  • CCA2 security.
  • Надежность аутентификации не менее 80 бит.
  • Возможность зашифровать не менее 232 сообщений общим объемом 250 байт. Ни одна атака с использованием до 232 выбранных простых или зашифрованных текстов не имеет вероятности успеха выше 2-32.

Примеры использования

См. разделы Шифрование данных и Привязка зашифрованного текста к контексту.