SHA-256 — криптографическая хеш-функция из семейства SHA-2, разработанная Национальным институтом стандартов и технологий (NIST). Она преобразует входные данные произвольной длины в фиксированное значение длиной 256 бит (32 байта). Результат работы алгоритма называют хешем, дайджестом или контрольной суммой.
Ключевые свойства:
Для работы с SHA-256 в JavaScript используется библиотека CryptoJS. Установка через npm:
npm install crypto-js
Импорт в коде:
const CryptoJS = require("crypto-js");
В ES-модулях:
import CryptoJS from "crypto-js";
Хеширование строки:
const hash = CryptoJS.SHA256("Hello, world!");
console.log(hash.toString());
Результат:
a591a6d40bf420404a011733cfb7b190...
По умолчанию результат представлен в виде объекта WordArray. Для
получения строки используется метод .toString().
CryptoJS поддерживает разные форматы вывода:
const hash = CryptoJS.SHA256("data");
console.log(hash.toString(CryptoJS.enc.Hex)); // шестнадцатеричный
console.log(hash.toString(CryptoJS.enc.Base64)); // base64
console.log(hash.toString(CryptoJS.enc.Latin1));
На практике чаще всего используется Hex.
CryptoJS.SHA256("password");
const data = { name: "Alice", age: 25 };
const hash = CryptoJS.SHA256(JSON.stringify(data));
const wordArray = CryptoJS.enc.Utf8.parse("binary data");
const hash = CryptoJS.SHA256(wordArray);
Для обработки больших данных используется поэтапное обновление:
const sha256 = CryptoJS.algo.SHA256.create();
sha256.update("Part 1");
sha256.update("Part 2");
const hash = sha256.finalize();
console.log(hash.toString());
Это особенно важно при работе с потоками или файлами.
SHA-256 сам по себе не защищает от атак по словарю. Для повышения безопасности используется соль:
const salt = CryptoJS.lib.WordArray.random(16);
const hash = CryptoJS.SHA256("password" + salt);
Соль должна:
HMAC (Hash-based Message Authentication Code) — механизм проверки целостности и подлинности данных с использованием секретного ключа.
const hash = CryptoJS.HmacSHA256("message", "secret-key");
console.log(hash.toString());
Применяется в:
Обычное сравнение строк может быть уязвимо к тайминговым атакам. Для безопасного сравнения рекомендуется:
function safeCompare(a, b) {
if (a.length !== b.length) return false;
let result = 0;
for (let i = 0; i < a.length; i++) {
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
}
return result === 0;
}
Прямое использование SHA-256 для паролей нежелательно. Лучше применять:
Но если используется SHA-256, обязательно добавлять соль:
const salt = CryptoJS.lib.WordArray.random(16).toString();
const hash = CryptoJS.SHA256(password + salt).toString();
const fileHash = CryptoJS.SHA256(fileContent).toString();
if (fileHash === expectedHash) {
console.log("Файл не поврежден");
}
const id = CryptoJS.SHA256(Date.now().toString()).toString();
SHA-256 работает по следующей схеме:
Предобработка сообщения
Разбиение на блоки по 512 бит
Инициализация начальных значений (8 регистров)
64 раунда преобразований
Формирование итогового хеша
SHA-256 достаточно быстрый, но:
SHA-256 остаётся универсальным и широко применяемым инструментом, особенно в задачах проверки целостности, цифровых подписей и криптографических протоколов.