Web Crypto API предоставляет интерфейс SubtleCrypto, в
котором реализован метод digest() для вычисления
криптографических хеш-функций. В контексте браузеров поддерживаются
следующие алгоритмы: SHA-1, SHA-256, SHA-384,
SHA-512.
Метод вычисления хеша имеет форму:
crypto.subtle.digest(algorithm, data)
где:
algorithm — строка с названием хеш-функцииdata — бинарные данные в виде ArrayBuffer
или TypedArrayPromise, возвращающий
ArrayBuffer с хеш-значениемSHA-1 является исторически первым широко распространённым алгоритмом хеширования в веб-криптографии. Его длина выхода составляет 160 бит (20 байт).
Использование SHA-1 в Web Crypto API:
const encoder = new TextEncoder();
const data = encoder.encode("example data");
const hashBuffer = await crypto.subtle.digest("SHA-1", data);
Результат представляет собой бинарный ArrayBuffer,
который часто преобразуется в шестнадцатеричную строку:
function toHex(buffer) {
return [...new Uint8Array(buffer)]
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
SHA-256 относится к семейству SHA-2 и является наиболее часто используемым алгоритмом в Web Crypto API. Длина хеша составляет 256 бит (32 байта).
Пример использования:
const encoder = new TextEncoder();
const data = encoder.encode("example data");
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
SHA-256 используется в:
SHA-384 является усечённой версией SHA-512 и генерирует 384-битный (48 байт) хеш.
Использование:
const encoder = new TextEncoder();
const data = encoder.encode("example data");
const hashBuffer = await crypto.subtle.digest("SHA-384", data);
SHA-512 является наиболее «тяжёлым» представителем семейства SHA-2 в Web Crypto API и производит 512-битный (64 байта) хеш.
Пример:
const encoder = new TextEncoder();
const data = encoder.encode("example data");
const hashBuffer = await crypto.subtle.digest("SHA-512", data);
Метод digest() не принимает строки напрямую. Входные
данные всегда должны быть бинарными. Для преобразования текста
используется TextEncoder.
Пример универсального преобразования:
function hashSHA256(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
return crypto.subtle.digest("SHA-256", data);
}
Возвращаемое значение digest() —
ArrayBuffer. Для практического использования часто
применяется преобразование в hex или base64.
function bufferToHex(buffer) {
return Array.from(new Uint8Array(buffer))
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
function bufferToBase64(buffer) {
const bytes = new Uint8Array(buffer);
let binary = "";
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
| Алгоритм | Размер выхода | Статус безопасности | Основное применение |
|---|---|---|---|
| SHA-1 | 160 бит | Устаревший | Совместимость |
| SHA-256 | 256 бит | Безопасный | Универсальный стандарт |
| SHA-384 | 384 бит | Высокая стойкость | TLS, корпоративные системы |
| SHA-512 | 512 бит | Максимальная стойкость | Криптографические системы высокого уровня |
SubtleCrypto работает асинхронно, что связано с архитектурой изоляции криптографических операций от основного потока выполнения.
crypto.subtle.digest("SHA-256", data)
.then(hash => {
// обработка результата
});
или через async/await:
const hash = await crypto.subtle.digest("SHA-256", data);
SHA-256, SHA-384 и SHA-512 интегрированы в современные криптографические стандарты:
SubtleCrypto.sign)SHA-1 встречается исключительно в устаревших системах и протоколах, где не обновлена криптографическая база.
crypto.subtle.digest("SHA-256", "text"); // ошибка
Корректный вариант:
const data = new TextEncoder().encode("text");
crypto.subtle.digest("SHA-256", data);
const hash = crypto.subtle.digest("SHA-256", data);
console.log(hash); // Promise
Результат всегда бинарный, не строковый. Без преобразования он не читаем в логах или UI.
SHA-256 рассматривается как базовый стандарт для большинства задач. SHA-384 и SHA-512 применяются в системах с повышенными требованиями к стойкости, где стоимость вычислений менее критична, чем криптографическая устойчивость.
SHA-1 сохраняется только для поддержки старых данных и интеграций, где невозможна миграция на SHA-2.
Метод digest() часто используется как вспомогательный
этап перед:
sign)