Национальный институт стандартов и технологий США (NIST) формирует фундаментальные требования к криптографическим алгоритмам, длинам ключей и режимам их использования. В контексте Web Crypto API соответствие этим стандартам означает выбор безопасных примитивов, корректную конфигурацию параметров и соблюдение ограничений на устаревшие алгоритмы.
В рамках современных рекомендаций NIST допускаются:
Симметричное шифрование:
Хеширование:
Асимметричная криптография:
Обмен ключами:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
Ключевые моменты:
NIST уделяет особое внимание жизненному циклу ключей:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
false,
["encrypt"] // только шифрование
);
Запрет на экспорт (extractable: false) снижает риск
компрометации.
OWASP (Open Web Application Security Project) фокусируется на прикладных аспектах безопасности веб-приложений. В отличие от NIST, который задаёт стандарты, OWASP описывает реальные угрозы и способы их предотвращения.
Для AES-GCM критично:
const iv = crypto.getRandomValues(new Uint8Array(12));
Повтор IV при том же ключе делает шифрование уязвимым к атакам. Это одно из наиболее критичных нарушений рекомендаций OWASP.
OWASP рекомендует использовать режимы, которые обеспечивают:
В Web Crypto API это реализовано через AES-GCM.
const encoded = new TextEncoder().encode("данные");
const ciphertext = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
key,
encoded
);
В режиме GCM встроена проверка подлинности. При расшифровке:
const decrypted = await crypto.subtle.decrypt(
{
name: "AES-GCM",
iv: iv
},
key,
ciphertext
);
Если данные были изменены — операция завершится с ошибкой.
OWASP строго запрещает:
Вместо этого рекомендуется:
const passwordKey = await crypto.subtle.importKey(
"raw",
new TextEncoder().encode("password"),
"PBKDF2",
false,
["deriveKey"]
);
const derivedKey = await crypto.subtle.deriveKey(
{
name: "PBKDF2",
salt: crypto.getRandomValues(new Uint8Array(16)),
iterations: 100000,
hash: "SHA-256"
},
passwordKey,
{
name: "AES-GCM",
length: 256
},
false,
["encrypt"]
);
Важно:
Использование таких алгоритмов нарушает как NIST, так и OWASP.
OWASP рекомендует:
const exported = await crypto.subtle.exportKey("jwk", key);
При этом:
OWASP выделяет несколько рисков:
Если злоумышленник внедрит код:
Меры защиты:
Web Crypto API доступен только в безопасном контексте:
Это соответствует требованиям OWASP по защите транспортного уровня.
Некорректные параметры — частая причина уязвимостей.
{
name: "AES-CBC",
iv: new Uint8Array(16) // фиксированный IV
}
OWASP подчёркивает:
Web Crypto API должен использоваться:
Рекомендации OWASP включают:
Разные браузеры могут:
Рекомендуется:
Такая конфигурация обеспечивает соответствие одновременно требованиям NIST и рекомендациям OWASP, формируя надёжную основу для криптографии в веб-приложениях.