Метод crypto.subtle.digest() предназначен для вычисления
криптографического хэша переданных данных. Хэш-функции преобразуют
входной массив байтов в фиксированную по длине последовательность,
обладающую следующими свойствами:
Метод возвращает Promise, который резолвится в
ArrayBuffer, содержащий результат хэширования.
crypto.subtle.digest(algorithm, data)
algorithmОпределяет используемый алгоритм хэширования. Может быть задан в двух формах:
name"SHA-1""SHA-256""SHA-384""SHA-512""SHA-256"
или
{ name: "SHA-256" }
"sha-256" приведёт к
ошибке"SHA-1" считается устаревшим и небезопасным для
большинства задачdataДанные для хэширования. Должны быть представлены в виде буфера байтов. Поддерживаются следующие типы:
ArrayBufferTypedArray (например, Uint8Array)DataViewconst encoder = new TextEncoder();
const data = encoder.encode("example");
Метод возвращает:
Promise<ArrayBuffer>
Результат необходимо дополнительно преобразовать для удобного использования (например, в строку HEX или Base64).
const encoder = new TextEncoder();
const data = encoder.encode("Hello, world!");
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hex = hashArray
.map(b => b.toString(16).padStart(2, "0"))
.join("");
const base64 = btoa(
String.fromCharCode(...new Uint8Array(hashBuffer))
);
Метод может выбрасывать исключения или отклонять Promise
в следующих случаях:
Неизвестный алгоритм
crypto.subtle.digest("MD5", data) // ошибкаНеверный тип данных
crypto.subtle.digest("SHA-256", "string") // ошибкаОтсутствие поддержки в окружении
Метод работает асинхронно и не блокирует основной поток, что особенно важно при обработке больших данных.
Весь входной массив должен быть загружен в память целиком. Для
потоковой обработки больших файлов digest не подходит —
требуется использование других API (например, Web Streams + сторонние
библиотеки).
В отличие от многих криптографических библиотек (например, Node.js
crypto.createHash()), Web Crypto API:
.update() и .final()algorithmХотя для digest параметр алгоритма минимален, важно
учитывать:
nameconst algorithm = { name: "SHA-512" };
Это полностью эквивалентно строке:
"SHA-512"
При вызове:
dataArrayBuffer| Алгоритм | Длина хэша | Безопасность | Производительность |
|---|---|---|---|
| SHA-1 | 160 бит | Низкая | Высокая |
| SHA-256 | 256 бит | Высокая | Средняя |
| SHA-384 | 384 бит | Очень высокая | Ниже средней |
| SHA-512 | 512 бит | Очень высокая | Ниже средней |
"SHA-256" как стандартный выбор"SHA-1"TextEncoderasync function hashSHA256(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const buffer = await crypto.subtle.digest("SHA-256", data);
return Array.from(new Uint8Array(buffer))
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
Web Crypto API доступен только в:
Попытка использовать API в небезопасном контексте приведёт к ошибке:
Uncaught DOMException: SubtleCrypto is not available
crypto.subtle.digest(
/* algorithm */ "SHA-256",
/* data */ Uint8Array
);
Минимальный и строгий интерфейс делает метод простым, но накладывает ограничения, которые необходимо учитывать при проектировании криптографических операций в браузере.