Примитив аутентифицированного шифрования с ассоциированными данными (AEAD) является наиболее распространенным примитивом для шифрования данных и подходит для большинства задач.
AEAD обладает следующими свойствами:
- Секретность : О содержании текста ничего не известно, кроме его длины.
- Подлинность : Невозможно изменить зашифрованный открытый текст, лежащий в основе зашифрованного текста, без обнаружения.
- Симметричный алгоритм : шифрование открытого текста и расшифровка зашифрованного текста выполняются с помощью одного и того же ключа.
- Рандомизация : Шифрование выполняется случайным образом. Два сообщения с одинаковым открытым текстом дают разные зашифрованные тексты. Злоумышленники не могут знать, какой зашифрованный текст соответствует данному открытому тексту. Если вы хотите этого избежать, используйте вместо этого детерминированный 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.
- AES-GCM (AES128_GCM, AES256_GCM) обычно является самым быстрым режимом с самыми строгими ограничениями на количество сообщений и их размер. Когда эти ограничения на длину открытого текста и связанных с ним данных (см. ниже) превышаются, AES-GCM дает катастрофический сбой и происходит утечка ключевого материала.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) почти так же быстр, как AES-GCM. Он имеет те же ограничения, что и AES-GCM, по количеству сообщений и размеру сообщений, но при превышении этих ограничений происходит менее катастрофический сбой: может быть раскрыта только информация о равенстве двух сообщений. Это делает его более безопасным в использовании, чем AES-GCM, но на практике он используется реже. Для использования этого алгоритма в Java необходимо установить Conscrypt .
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) имеет гораздо более высокие ограничения по количеству и размеру сообщений, чем AES-GCM, но в случае сбоя (что крайне маловероятно) происходит утечка ключевого материала. Он не использует аппаратное ускорение, поэтому может работать медленнее, чем режимы AES, в ситуациях, когда доступно аппаратное ускорение.
Гарантии безопасности
Реализации AEAD предлагают:
- Безопасность CCA2.
- Надежность аутентификации не менее 80 бит.
- Возможность зашифровать как минимум 2³² сообщений общим объемом 2³⁰ байт. Ни одна атака с использованием до 2³² выбранных открытых или зашифрованных текстов не имеет вероятности успеха, превышающей 2³² .
Примеры вариантов использования
Видите ли, я хочу зашифровать данные и привязать зашифрованный текст к его контексту .