Примитив AEAD (аутентифицированное шифрование с присоединенными данными) – самый распространенный примитив для шифрования данных, который подходит для большинства задач.
AEAD имеет следующие свойства:
- Secrecy О незашифрованном тексте ничего не известно, кроме его длины.
- Подлинность. Невозможно изменить зашифрованный текст, не оставив следов.
- Симметричное. Для шифрования открытого текста и расшифровки зашифрованного текста используется один и тот же ключ.
- Случайное шифрование. Шифрование выполняется случайным образом. Два сообщения с одинаковым простым текстом дают разные зашифрованные тексты. Злоумышленники не могут узнать, какой зашифрованный текст соответствует заданному простому тексту. Если вы хотите этого избежать, используйте детерминированное AEAD-шифрование.
Связанные данные
AEAD можно использовать, чтобы связать зашифрованный текст с определенными связанными данными. Предположим, у вас есть база данных с полями user-id и encrypted-medical-history. В этом случае user-id можно использовать в качестве связанных данных при шифровании encrypted-medical-history. Это не позволит злоумышленнику перенести историю болезни одного пользователя другому.
Связанные данные указывать необязательно. Если указать этот параметр, расшифровка будет успешной, только если в вызовы шифрования и расшифровки переданы одни и те же связанные данные.
Выберите тип ключа
Хотя для большинства случаев мы рекомендуем AES128_GCM, существуют различные типы ключей для разных потребностей. AES128 обеспечивает 128-битный уровень безопасности, а AES256 – 256-битный.
При выборе режима следует учитывать два важных ограничения безопасности:
- Запросов в секунду: сколько сообщений зашифровано одним ключом?
- Размер сообщений.
Поддерживаемые типы ключей:
- 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-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.
Примеры использования
Я хочу зашифровать данные и привязать зашифрованный текст к его контексту.