AES-GCM относится к режимам аутентифицированного шифрования (AEAD —
Authenticated Encryption with Associated Data), в которых одновременно
обеспечивается конфиденциальность данных и их целостность. В контексте
Web Crypto API этот режим реализуется через алгоритм AES с режимом
Galois/Counter Mode, доступный через интерфейс
SubtleCrypto.
Классическое шифрование решает задачу сокрытия содержимого, но не защищает от незаметной модификации зашифрованного текста. AES-GCM устраняет этот недостаток за счёт встроенного механизма аутентификации:
Если данные были изменены, расшифровка завершится ошибкой ещё до получения результата.
Работа с AES-GCM в браузере осуществляется через объект:
crypto.subtle
Основные методы:
generateKeyencryptdecryptimportKeyexportKeyКлюч создаётся через generateKey:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
Параметры:
name: всегда "AES-GCM"length: 128, 192 или 256 битextractable: возможность извлечения ключаkeyUsages: операции с ключомNonce (Number used once), он же IV (Initialization Vector), является критически важным элементом AES-GCM.
В Web Crypto API он передаётся как iv:
const iv = crypto.getRandomValues(new Uint8Array(12));
AES-GCM оптимизирован под 96-битный nonce, что позволяет:
Шифрование выполняется через encrypt:
const encoded = new TextEncoder().encode("секретное сообщение");
const ciphertext = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
key,
encoded
);
Результат ciphertext — это ArrayBuffer,
содержащий:
Аутентификационный тег обеспечивает проверку целостности и подлинности данных.
В AES-GCM:
Если хотя бы один бит данных изменён, проверка тега проваливается.
AES-GCM поддерживает механизм AAD (Additional Authenticated Data). Эти данные:
Пример использования:
const additionalData = new TextEncoder().encode("header-info");
Шифрование с AAD:
const ciphertext = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv,
additionalData: additionalData
},
key,
encoded
);
AAD часто используется для:
В Web Crypto API можно задать длину тега:
{
name: "AES-GCM",
iv: iv,
tagLength: 128
}
Особенности:
Расшифровка выполняется через decrypt:
const decrypted = await crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: iv
},
key,
ciphertext
);
const decoded = new TextDecoder().decode(decrypted);
Ключевые моменты:
OperationErrorВ отличие от некоторых низкоуровневых реализаций, Web Crypto API:
Внутренне структура выглядит как:
[ciphertext || authentication tag]
Повторное использование nonce с тем же ключом приводит к:
Рекомендуется использовать:
AAD не скрывается, но:
Web Crypto API накладывает ряд ограничений:
extractable: falseСамая критическая ошибка:
const iv = new Uint8Array(12); // ПЛОХО: фиксированный IV
try {
await crypto.subtle.decrypt(...);
} catch (e) {
// ошибка целостности или неверный ключ
}
Любое несоответствие:
приводит к невозможности расшифровки.
encrypt)decrypt)AES-GCM в Web Crypto API объединяет криптографическую стойкость AES и механизм аутентификации Galois Field, обеспечивая защищённый обмен данными без необходимости отдельно реализовывать контроль целостности.