javascript42
Главная
Все учебники
Блог
Учебник sjcl (Stanford JS Crypto Library)
Введение в криптографию и SJCL
Зачем нужна криптография на стороне клиента
Место SJCL среди других криптобиблиотек JavaScript
История проекта и команда Stanford
Обзор поддерживаемых алгоритмов и примитивов
Принципы безопасного проектирования, заложенные в библиотеку
Ограничения браузерной криптографии
Установка и настройка окружения
Подключение через CDN и прямую загрузку
Установка через npm и yarn
Сборка библиотеки из исходников
Минимальная и расширенная конфигурации сборки
Подключение в Node.js
Подключение в браузере без сборщиков
Интеграция с Webpack, Rollup и Vite
Проверка корректности установки
Архитектура и внутреннее устройство
Структура пространства имён sjcl
Модульная организация кода
Система кодеков и представлений данных
Bitarray — основной внутренний формат данных
Преобразование между строками, байтами, hex и base64
Генератор псевдослучайных чисел и его инициализация
Entropy pool и накопление энтропии
Обработка исключений и коды ошибок
Симметричное шифрование
Блочный шифр AES: теоретическая основа
Реализация AES в SJCL и её особенности
Режим CCM: устройство и параметры
Режим OCB2: устройство и параметры
Режим GCM: устройство и параметры
Выбор режима шифрования под конкретную задачу
Параметры тегов аутентификации и их длина
Работа с дополнительными аутентифицированными данными (AAD)
Длины ключей: 128, 192, 256 бит
Типичные ошибки при использовании симметричного шифрования
Высокоуровневый интерфейс sjcl.json
Структура зашифрованного JSON-объекта
Поля iv, salt, ct, adata, ks, iter, mode, ts
Шифрование строки через sjcl.encrypt
Расшифровка через sjcl.decrypt
Настройка параметров через объект конфигурации
Совместимость формата между версиями библиотеки
Сериализация и десериализация зашифрованных объектов
Передача зашифрованных данных по сети
Деривация ключей
Понятие KDF и необходимость растяжения пароля
PBKDF2: алгоритм и параметры итераций
Выбор числа итераций в зависимости от контекста
Использование соли и её генерация
Деривация нескольких ключей из одного пароля
scrypt в SJCL: подключение и использование
Сравнение PBKDF2 и scrypt для разных сценариев
Хранение параметров деривации вместе с шифртекстом
Хэш-функции
SHA-256: реализация и применение
SHA-512: реализация и применение
SHA-1: реализация, применение и предупреждения
SHA-3 и семейство Keccak в SJCL
RIPEMD-160: подключение и использование
Хэширование произвольных данных
Хэширование потоков и больших объёмов данных
Сравнение производительности хэш-функций
Коды аутентификации сообщений
Теория MAC и его назначение
HMAC: конструкция и параметры
Использование HMAC с различными хэш-функциями
Верификация MAC без уязвимости к timing-атакам
HMAC для аутентификации API-запросов
Отличие MAC от цифровой подписи
Криптография на эллиптических кривых
Математические основы ECC в прикладном контексте
Кривые, поддерживаемые SJCL: c256, c384, c521
Генерация пары ключей на эллиптической кривой
Представление точек кривой в SJCL
Сложение и умножение точек через публичный API
Сериализация и десериализация ключей ECC
Протокол Диффи-Хеллмана на эллиптических кривых
Принцип ECDH и обмен ключами
Генерация эфемерных ключей
Вычисление общего секрета
Деривация симметричного ключа из общего секрета
Реализация защищённого канала на основе ECDH
Уязвимость к атаке man-in-the-middle и способы защиты
Цифровые подписи ECDSA
Принцип работы ECDSA
Генерация ключей для подписи
Подписание сообщения
Верификация подписи
Формат подписи в SJCL
Использование детерминированного ECDSA (RFC 6979)
Типичные ошибки реализации ECDSA
Подпись токенов и документов на практике
Схема шифрования с открытым ключом
Гибридное шифрование: зачем оно нужно
Реализация гибридного шифрования в SJCL
ECIES: Elliptic Curve Integrated Encryption Scheme
Шифрование для нескольких получателей
Управление открытыми ключами получателей
Верификация источника зашифрованного сообщения
Генерация случайных чисел
Архитектура PRNG в SJCL
Источники энтропии в браузере
Источники энтропии в Node.js
Добавление пользовательской энтропии
Форсированная инициализация PRNG
Генерация случайных байт и слов
Проверка достаточности накопленной энтропии
Уязвимости, связанные с недостатком энтропии
Кодеки и представление данных
Кодек hex: кодирование и декодирование
Кодек base64: стандартный и URL-safe вариант
Кодек UTF-8: работа с текстом
Кодек bytes: работа с типизированными массивами
Преобразование между кодеками
Взаимодействие с ArrayBuffer и Uint8Array
Типичные ошибки при преобразовании данных
Секретное разделение и пороговые схемы
Схема разделения секрета Шамира
Параметры n и k в пороговой схеме
Разделение ключа на части через sjcl.secret
Восстановление секрета из k частей
Проверка корректности частей секрета
Практические сценарии применения разделения секрета
Расширение и кастомизация библиотеки
Регистрация собственного режима шифрования
Добавление новой хэш-функции
Расширение пространства имён sjcl
Написание собственного кодека
Замена PRNG на внешний источник случайности
Патчинг и monkey-patching: риски и подходы
Производительность и оптимизация
Профилирование криптографических операций
Сравнение производительности режимов AES
Влияние длины ключа на скорость
Оптимизация числа итераций PBKDF2
Асинхронные операции и Web Workers
Использование SubtleCrypto совместно с SJCL
Кэширование производных ключей
Минимизация сборки для уменьшения размера бандла
Безопасное хранение данных в браузере
Угрозы при хранении криптографических материалов
Шифрование данных перед записью в localStorage
Работа с IndexedDB и зашифрованными записями
Хранение ключей в sessionStorage и его ограничения
Web Crypto API Key Storage как альтернатива
Защита от XSS при работе с ключами в памяти
Очистка чувствительных данных из памяти
Безопасная передача данных
Шифрование данных перед отправкой на сервер
Аутентификация сообщений при передаче через WebSocket
Сквозное шифрование в веб-приложениях
Согласование ключей между клиентом и сервером
Проверка целостности получаемых данных
Защита от атак повторного воспроизведения
Типичные уязвимости и атаки
Padding oracle атака и как её избежать
Атаки на основе повторного использования IV
Timing-атаки на операции сравнения
Атаки на реализацию ECDSA при слабом RNG
Атаки на PBKDF2 с малым числом итераций
Утечка данных через побочные каналы в JS
Уязвимости, специфичные для браузерного окружения
Аудит использования SJCL в проекте
Тестирование криптографического кода
Юнит-тестирование криптографических функций
Тест-векторы для AES, SHA, HMAC
Проверка соответствия стандартным тест-векторам NIST
Фаззинг криптографических входных данных
Тестирование граничных случаев и ошибочных входов
Интеграционное тестирование шифрованного обмена
Автоматизация тестирования в CI/CD
Совместимость с серверными реализациями
Расшифровка данных SJCL на Python (cryptography, PyCryptodome)
Расшифровка данных SJCL на Node.js без SJCL
Совместимость с OpenSSL
Совместимость с Java и Bouncy Castle
Согласование форматов ключей и параметров
Типичные проблемы совместимости и их решения