javascript42
Главная
Все учебники
Блог
Учебник webcrypto (Web Crypto API)
Введение в Web Crypto API
Что такое Web Crypto API и зачем он нужен
История развития криптографии в браузере
Сравнение с устаревшими подходами: Math.random, btoa/atob, сторонние библиотеки
Обзор спецификации W3C Web Cryptography API
Поддержка браузерами и средами выполнения
Объект window.crypto и его структура
Безопасный контекст: HTTPS как обязательное условие
Архитектура и базовые концепции
Синхронный и асинхронный интерфейс библиотеки
SubtleCrypto: основной рабочий объект
Промисы в Web Crypto API
Алгоритмы и параметры алгоритмов
Типы ключей: CryptoKey и CryptoKeyPair
ArrayBuffer и TypedArray как основной формат данных
Кодирование и декодирование данных: TextEncoder, TextDecoder
Понятие extractable и usages у ключей
Обработка ошибок и исключений
Генерация случайных чисел
crypto.getRandomValues: назначение и ограничения
Отличие от псевдослучайных генераторов
Типизированные массивы для генерации случайных значений
Генерация случайных токенов и идентификаторов
crypto.randomUUID
Практические паттерны безопасной генерации случайных данных
Типичные ошибки при работе с рандомизацией
Хеширование
Понятие криптографической хеш-функции
Поддерживаемые алгоритмы: SHA-1, SHA-256, SHA-384, SHA-512
Метод subtle.digest
Параметры вызова digest
Хеширование строк через TextEncoder
Хеширование бинарных данных
Сравнение хешей без timing-атак
Использование SHA-1: когда допустимо, а когда нет
Цепочечное и инкрементальное хеширование: обходные пути
Практика: контрольные суммы файлов в браузере
Управление ключами
Жизненный цикл ключа в Web Crypto API
Метод subtle.generateKey
Параметры генерации для симметричных алгоритмов
Параметры генерации для асимметричных алгоритмов
Метод subtle.importKey
Форматы импорта: raw, pkcs8, spki, jwk
Метод subtle.exportKey
Ограничения экспорта и флаг extractable
Метод subtle.wrapKey
Метод subtle.unwrapKey
JSON Web Key (JWK): структура и поля
Хранение ключей в IndexedDB
Передача ключей между вкладками через постсообщения
Срок жизни ключей и их ротация
Симметричное шифрование
Основы симметричного шифрования
AES: общие сведения и режимы работы
AES-CBC: алгоритм, вектор инициализации, паддинг
AES-GCM: аутентифицированное шифрование, тег аутентификации, nonce
AES-CTR: потоковый режим, счётчик
Метод subtle.encrypt
Метод subtle.decrypt
Генерация и управление IV и nonce
Почему нельзя переиспользовать nonce в AES-GCM
Выбор длины ключа: 128 vs 192 vs 256 бит
Шифрование больших объёмов данных: разбивка на чанки
Практика: шифрование файла в браузере
Практика: защищённое локальное хранилище
Асимметричное шифрование
Основы асимметричного шифрования
RSA-OAEP: принцип работы и параметры
Выбор длины ключа RSA
Хеш-алгоритм в составе RSA-OAEP
Метод subtle.encrypt для RSA-OAEP
Метод subtle.decrypt для RSA-OAEP
Ограничения RSA на размер шифруемых данных
Гибридное шифрование: RSA + AES на практике
Экспорт и импорт RSA-ключей в форматах spki и pkcs8
Цифровая подпись
Принципы цифровой подписи
RSASSA-PKCS1-v1_5: алгоритм и применение
RSA-PSS: параметры saltLength и отличия от PKCS1
ECDSA: эллиптические кривые P-256, P-384, P-521
Метод subtle.sign
Метод subtle.verify
Подпись документов и произвольных данных
Подпись нескольких блоков данных
Формат подписи DER vs IEEE P1363
Проверка подписи на стороне сервера
Практика: подпись HTTP-запросов в браузере
Практика: верификация JWT-токенов вручную
Алгоритмы на эллиптических кривых
Введение в криптографию на эллиптических кривых
Кривые P-256, P-384, P-521: сравнение и выбор
ECDH: протокол Диффи-Хеллмана на эллиптических кривых
Метод subtle.generateKey для ECDH
Метод subtle.deriveKey через ECDH
ECDSA: подпись и верификация
Экспорт и импорт ключей ECDH и ECDSA
Совместимость с серверными реализациями
Выработка ключей из пароля и общего секрета
PBKDF2: Password-Based Key Derivation Function
Параметры PBKDF2: соль, число итераций, хеш, длина ключа
Рекомендации по числу итераций PBKDF2
HKDF: HMAC-based Key Derivation Function
Параметры HKDF: соль, info, хеш
Метод subtle.deriveKey
Метод subtle.deriveBits
Выбор между PBKDF2 и HKDF
Генерация нескольких ключей из одного мастер-ключа
Практика: шифрование данных паролем пользователя
Коды аутентификации сообщений
HMAC: принцип работы и назначение
Поддерживаемые хеш-алгоритмы в HMAC
Генерация HMAC-ключа
Метод subtle.sign для HMAC
Метод subtle.verify для HMAC
Сравнение HMAC и цифровой подписи
Защита от подделки данных с помощью HMAC
Практика: проверка целостности данных в localStorage
Продвинутые темы
Составные криптографические схемы
Envelope encryption: концепция и реализация
Секретное разделение ключей (Secret Sharing): обходные пути
Детерминированное шифрование и его риски
Повторное использование ключевого материала: когда допустимо
Атаки на реализации: timing, padding oracle, nonce reuse
Защита от атак через выбор параметров и правильный дизайн
Криптографические протоколы поверх Web Crypto API
Тестирование криптографического кода
Аудит криптографических реализаций
Производительность
Асинхронность и её влияние на производительность
Бенчмаркинг операций Web Crypto API
Параллельная обработка с Promise.all
Web Workers для криптографических операций
Потоковая обработка данных: ReadableStream и шифрование
Кеширование ключей и управление памятью
Профилирование узких мест
Безопасность реализаций
Типичные ошибки разработчиков при использовании Web Crypto API
Безопасное хранение ключевого материала в браузере
Утечки через side-channel в браузерной среде
Content Security Policy и Web Crypto
Изоляция контекста и защита от XSS
Аудит зависимостей в криптографических проектах
Соответствие стандартам NIST и рекомендациям OWASP