Криптографическая хеш-функция — это детерминированный алгоритм, преобразующий входные данные произвольной длины в фиксированную строку байтов (хеш, дайджест). Результат вычисления зависит исключительно от входа и всегда имеет одинаковый размер вне зависимости от объёма исходных данных.
В контексте библиотеки Crypto-js хеш-функции применяются для обеспечения целостности данных, построения цифровых подписей, хранения паролей и создания производных ключей.
1. Детерминированность Один и тот же вход всегда даёт одинаковый хеш:
CryptoJS.SHA256("hello").toString();
2. Быстрота вычисления Алгоритм должен эффективно обрабатывать данные любой длины, включая большие массивы.
3. Устойчивость к прообразу (Preimage resistance) По известному хешу практически невозможно восстановить исходные данные.
4. Устойчивость ко второму прообразу (Second preimage resistance) Сложно найти другое сообщение, дающее тот же хеш, что и заданное.
5. Устойчивость к коллизиям (Collision resistance) Практически невозможно найти два разных входных значения с одинаковым хешем.
Алгоритмы хеширования обрабатывают данные блоками фиксированного размера. Каждый блок проходит через серию преобразований:
Результат одного блока влияет на следующий, формируя цепочку вычислений (принцип «цепного хеширования»).
Дополнение (Padding) Исходные данные дополняются до кратного размеру блока. Обычно добавляется:
10Разбиение на блоки Сообщение делится на блоки фиксированной длины (например, 512 бит для SHA-256).
Инициализация состояния Задаются начальные константы (внутреннее состояние алгоритма).
Основной цикл обработки Каждый блок последовательно изменяет внутреннее состояние.
Формирование результата Финальное состояние преобразуется в хеш фиксированной длины.
const hash = CryptoJS.SHA256("Hello World");
console.log(hash.toString());
Особенности:
Crypto-js возвращает объект типа WordArray. Для
получения строки используется метод .toString():
hash.toString(CryptoJS.enc.Hex); // шестнадцатеричный формат
hash.toString(CryptoJS.enc.Base64); // Base64
MD5
CryptoJS.MD5("data");
SHA-1
CryptoJS.SHA1("data");
SHA-2 (SHA-256, SHA-512)
CryptoJS.SHA256("data");
CryptoJS.SHA512("data");
SHA-3
CryptoJS.SHA3("data");
Незначительное изменение входных данных полностью меняет хеш:
CryptoJS.SHA256("hello");
CryptoJS.SHA256("hello!");
Результаты будут радикально отличаться, что делает хеши пригодными для обнаружения изменений.
При работе с паролями добавляется случайное значение:
const salt = CryptoJS.lib.WordArray.random(16);
const hash = CryptoJS.SHA256("password" + salt);
Назначение:
Crypto-js поддерживает механизм HMAC (Hash-based Message Authentication Code):
CryptoJS.HmacSHA256("message", "secret-key");
Особенности:
Crypto-js позволяет хешировать данные частями:
const sha256 = CryptoJS.algo.SHA256.create();
sha256.update("Hello ");
sha256.update("World");
const result = sha256.finalize();
Преимущества:
Проверка целостности
const fileHash = CryptoJS.SHA256(fileContent);
Хеширование паролей
const hash = CryptoJS.SHA256(password);
Цифровые подписи (в связке с другими алгоритмами)
Кеширование данных
Crypto-js использует собственную структуру данных:
CryptoJS.lib.WordArray
Содержит:
Пример создания:
const data = CryptoJS.enc.Utf8.parse("text");
Для повышения устойчивости применяется многократное хеширование:
let hash = "password";
for (let i = 0; i < 1000; i++) {
hash = CryptoJS.SHA256(hash);
}
Это увеличивает стоимость атак перебора.
| Характеристика | Хеширование | Шифрование |
|---|---|---|
| Обратимость | Нет | Да |
| Ключ | Не обязателен | Требуется |
| Цель | Целостность | Конфиденциальность |