javascript42
Главная
Все учебники
Блог
Учебник Crypto-js
Введение в CryptoJS
Что такое CryptoJS и зачем он нужен
Место CryptoJS в экосистеме JavaScript
Обзор возможностей библиотеки
Установка через npm и подключение через CDN
Структура пакета и модульная архитектура
Сравнение с Web Crypto API и другими библиотеками
Архитектура и внутреннее устройство
Базовый тип WordArray
Преобразование данных: строки, байты, hex, Base64
Кодировки и пространство имён CryptoJS.enc
Форматы сериализации зашифрованных данных
Объект CipherParams и его поля
Алгоритм работы с ключами внутри библиотеки
Хеш-функции
Принципы работы криптографических хешей
MD5: применение и ограничения
SHA-1: устаревший стандарт и причины отказа
SHA-256: основной рабочий алгоритм
SHA-224, SHA-384, SHA-512
SHA-3 и семейство Keccak
RIPEMD-160
Прогрессивное хеширование: метод update и finalize
Хеширование файлов и бинарных данных
Сравнение производительности алгоритмов
Коды аутентификации сообщений (MAC)
Принцип работы HMAC
HMAC-MD5
HMAC-SHA1
HMAC-SHA256 и HMAC-SHA512
Выбор алгоритма для HMAC в зависимости от задачи
Прогрессивное вычисление HMAC
Проверка целостности данных с помощью HMAC
HMAC в протоколах аутентификации API
Симметричное шифрование: блочные шифры
Принципы симметричного шифрования
Алгоритм AES: история и стандарт
AES-128, AES-192, AES-256: ключи и стойкость
Алгоритм DES и его уязвимости
Triple DES (3DES): когда и зачем использовать
Алгоритм Rabbit
Алгоритм RC4 и причины отказа от него
Алгоритм Blowfish
Режимы шифрования блочных шифров
Режим ECB и почему его не следует использовать
Режим CBC: цепочка блоков шифротекста
Режим CFB: обратная связь по шифротексту
Режим OFB: обратная связь по выходу
Режим CTR: счётчик
Выбор режима в зависимости от сценария
Векторы инициализации и управление состоянием
Роль вектора инициализации
Генерация случайного IV
Передача IV вместе с шифротекстом
Фиксированный IV: ошибки и последствия
Управление состоянием при потоковом шифровании
Схемы дополнения (Padding)
Зачем нужно дополнение блока
PKCS7: стандарт и реализация
ISO10126
ISO97971
ZeroPadding
NoPadding: когда применяется
Кастомная схема дополнения
Управление ключами и производные функции
Генерация ключей из паролей: зачем нужен KDF
PBKDF2: параметры, итерации, длина ключа
EvpKDF: совместимость с OpenSSL
Соль и её роль в защите от атак по словарю
Хранение и передача ключей
Выработка нескольких ключей из одного пароля
Шифрование и расшифровка на практике
Полный цикл шифрования строки через AES
Передача ключа как строки и как WordArray
Автоматическая генерация ключа и IV в CryptoJS
Ручная передача ключа, IV и соли
Расшифровка: типичные ошибки и их причины
Работа с бинарными данными
Шифрование JSON-объектов
Шифрование данных в localStorage
Совместимость шифрования с серверными языками
Форматы и кодировки данных
Base64: кодирование и декодирование
Hex-строки: получение и разбор
Latin1 и работа с однобайтовыми кодировками
UTF-8: правильная работа с Unicode
Конвертация между форматами
Сериализация CipherParams в строку и обратно
Разработка собственного формата сериализации
Случайные числа и генерация энтропии
Метод CryptoJS.lib.WordArray.random
Источники энтропии в браузере и Node.js
Генерация случайных ключей и соли
Ограничения генератора CryptoJS
Сравнение с crypto.getRandomValues
CryptoJS в Node.js
Подключение и настройка в серверном окружении
Совместимость с модульными системами CommonJS и ESM
Шифрование файлов на диске
Потоковая обработка данных
Совместимость с модулем crypto стандартной библиотеки
Типичные отличия поведения от браузерного окружения
CryptoJS в браузере
Подключение через script-тег и CDN
Сборка с webpack, Rollup, Vite
Tree-shaking и оптимизация бандла
Работа с File API и ArrayBuffer
Ограничения браузерной среды
Безопасность и типичные ошибки
Неправильное использование ECB
Слабые пароли и отсутствие KDF
Повторное использование IV
Отсутствие проверки целостности
Хранение ключей в коде клиента
Уязвимости атаки по времени при сравнении хешей
Ошибки при работе с кодировками
Что CryptoJS не умеет: асимметричное шифрование, цифровые подписи
Производительность
Бенчмаркинг алгоритмов в браузере
Оптимизация при работе с большими объёмами данных
Сравнение CryptoJS и Web Crypto API по скорости
Многопоточность и Web Workers
Ленивые вычисления и кеширование промежуточных состояний
Расширение библиотеки
Архитектура наследования через CryptoJS.lib.Base
Написание собственного алгоритма хеширования
Написание собственного режима шифрования
Написание собственной схемы дополнения
Подключение сторонних алгоритмов
Тестирование криптографического кода
Принципы тестирования криптографии
Тестовые векторы и эталонные значения
Юнит-тесты для хеш-функций
Юнит-тесты для шифрования и расшифровки
Тестирование совместимости с серверной стороной
Инструменты: Jest, Mocha, встроенный assert