Прогрессивное (инкрементальное) хеширование позволяет обрабатывать
данные частями, не загружая их полностью в память. Это особенно важно
при работе с большими файлами, потоками данных или при поэтапной
обработке входной информации. В библиотеке Crypto-js этот механизм
реализован через методы update и finalize.
Вместо однократного вызова хеш-функции с полной строкой используется объект хешера, который принимает данные порциями:
update(data) — добавляет новую часть данных в
вычисление хешаfinalize([data]) — завершает вычисление и возвращает
итоговый хешПосле вызова finalize объект хешера считается
завершённым и не должен использоваться повторно.
Для начала создаётся экземпляр хеш-алгоритма:
const hash = CryptoJS.algo.SHA256.create();
Crypto-js поддерживает различные алгоритмы (SHA1,
SHA256, SHA512, MD5 и др.), и
каждый из них имеет одинаковый интерфейс для прогрессивной
обработки.
Метод update принимает строку или объект
WordArray и добавляет его к внутреннему состоянию
хешера.
hash.update("Часть 1 данных");
hash.update("Часть 2 данных");
hash.update("Часть 3 данных");
Особенности:
Метод finalize завершает вычисление:
const result = hash.finalize();
Также допускается передача последней порции данных:
const result = hash.finalize("Последняя часть");
После вызова:
WordArray, содержащий хешupdate недопустимыconst hash = CryptoJS.algo.SHA256.create();
hash.update("Hello ");
hash.update("World");
const digest = hash.finalize();
console.log(digest.toString(CryptoJS.enc.Hex));
Результат будет идентичен:
CryptoJS.SHA256("Hello World");
Crypto-js реализует буферизацию входных данных:
update или
finalizeЭто обеспечивает:
Для точного контроля над входом используется
WordArray:
const wordArray = CryptoJS.enc.Utf8.parse("Данные");
hash.update(wordArray);
Это важно при работе с:
Типичный сценарий — обработка больших файлов по частям:
const hash = CryptoJS.algo.SHA256.create();
function processChunk(chunk) {
hash.update(chunk);
}
// После обработки всех частей
const result = hash.finalize();
Такой подход:
После вызова finalize объект нельзя “сбросить”. Для
нового вычисления создаётся новый экземпляр:
const newHash = CryptoJS.algo.SHA256.create();
1. Повторный вызов update после finalize
hash.finalize();
hash.update("ещё данные"); // ошибка логики
2. Ожидание строки вместо WordArray
const result = hash.finalize();
console.log(result); // объект, не строка
Правильно:
result.toString(CryptoJS.enc.Hex);
3. Несогласованная кодировка
Разные способы представления строки могут дать разные результаты:
CryptoJS.enc.Utf8.parse("text")
CryptoJS.enc.Latin1.parse("text")
| Подход | Особенности |
|---|---|
| Однократный | Простота, подходит для небольших данных |
| Прогрессивный | Масштабируемость, контроль, работа с потоками |
Прогрессивный подход также поддерживается для HMAC:
const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "secret");
hmac.update("data1");
hmac.update("data2");
const result = hmac.finalize();
Прогрессивное хеширование применяется в:
Преимущества:
Недостатки:
create() — инициализация хешераupdate() — накопление данныхfinalize() — завершение и получение результатаТакой паттерн полностью повторяет поведение низкоуровневых криптографических API и обеспечивает максимальную гибкость при работе с данными любого размера.