Библиотека Crypto-JS построена по модульному принципу: каждая
криптографическая примитивная операция вынесена в отдельный файл, а
общая логика объединена через единое пространство имён
CryptoJS. Это позволяет подключать только необходимые
компоненты и снижать итоговый размер бандла.
Внутренняя структура пакета условно делится на несколько уровней:
Каждый модуль может существовать независимо, но большинство из них опираются на ядро.
Файл core.js — фундамент всей архитектуры. В нём
определены базовые конструкции:
BaseОбеспечивает механизм наследования и расширения:
extend() — создание нового объекта с прототипным
наследованиемcreate() — фабричный метод для инстанцированияinit() — конструкторmixIn() — смешивание свойствclone() — клонирование объектаЭта система позволяет реализовать объектно-ориентированный стиль без использования классов ES6.
WordArrayКлючевой тип данных в Crypto-JS. Представляет массив 32-битных слов:
words — массив чиселsigBytes — количество значимых байтовОсобенности:
concat)toString)enc)Модуль enc содержит стратегии преобразования между
строками и WordArray:
Каждый кодировщик реализует методы:
parse(string) — строка → WordArraystringify(wordArray) — WordArray → строкаКаждый алгоритм реализован как отдельный модуль, например:
md5.jssha1.jssha256.jssha512.jsВсе хеш-функции наследуются от Hasher, который определён
в ядре:
_doReset() — инициализация состояния_doProcessBlock() — обработка блока данных_doFinalize() — завершение вычисленияПример архитектуры:
Hasher
└── SHA256
└── MD5
└── SHA1
Каждый алгоритм:
Позволяет обрабатывать данные по частям:
var hasher = CryptoJS.algo.SHA256.create();
hasher.update("part1");
hasher.update("part2");
var hash = hasher.finalize();
Реализует блочные и потоковые шифры.
CipherОпределяет общий интерфейс:
createEncryptor(key, cfg)createDecryptor(key, cfg)process(data)finalize(data)BlockCipher — для блочных алгоритмов (AES, DES)StreamCipher — для потоковых (RC4)Модуль aes.js включает:
Режимы вынесены в отдельные модули:
mode-cbc.jsmode-cfb.jsmode-ctr.jsmode-ofb.jsmode-ecb.jsКаждый режим:
BlockCipherПример:
CryptoJS.mode.CBC
CryptoJS.mode.CTR
Необходимы для выравнивания данных под размер блока.
Реализованы как стратегии:
Pkcs7 (по умолчанию)AnsiX923Iso10126ZeroPaddingNoPaddingКаждый модуль содержит методы:
pad(data, blockSize)unpad(data)Форматы отвечают за представление зашифрованных данных:
Стандартный формат:
CryptoJS.format.OpenSSL
Содержит:
Реализует механизм аутентификации сообщений.
Структура:
Пример:
CryptoJS.HmacSHA256(message, key)
Архитектурно:
Hasher
└── HMAC
└── SHA256
Модуль для генерации ключей из пароля:
Структура:
CryptoJS.PBKDF2(password, salt, {
keySize,
iterations
})
Модульная архитектура строится на принципе композиции:
Cipher использует WordArrayCipherHasherЭто обеспечивает:
Все компоненты доступны через единый объект:
CryptoJS
Внутреннее разделение:
CryptoJS.lib — базовые классыCryptoJS.enc — кодировкиCryptoJS.algo — алгоритмыCryptoJS.mode — режимыCryptoJS.pad — паддингиCryptoJS.format — форматыПример:
CryptoJS.algo.SHA256
CryptoJS.enc.Hex
CryptoJS.mode.CBC
При использовании через npm или CDN:
Пример модульного подключения:
require('crypto-js/core');
require('crypto-js/sha256');
require('crypto-js/aes');
Это позволяет:
Архитектура позволяет добавлять собственные алгоритмы:
Hasher или CipherCryptoJS.algoПример расширения:
var MyHash = CryptoJS.lib.Hasher.extend({
_doReset: function () {},
_doProcessBlock: function () {},
_doFinalize: function () {}
});
Crypto-JS может использоваться с:
Особенности:
CryptoJS
├── lib
│ ├── Base
│ ├── WordArray
│ └── Hasher
│
├── enc
│ ├── Hex
│ ├── Utf8
│ └── Base64
│
├── algo
│ ├── SHA256
│ ├── MD5
│ └── AES
│
├── mode
│ ├── CBC
│ └── CTR
│
├── pad
│ ├── Pkcs7
│ └── ZeroPadding
│
└── format
└── OpenSSL
Такая структура делает Crypto-JS гибкой и пригодной как для учебных задач, так и для прикладного использования в веб-разработке.