Поддерживаемые алгоритмы: SHA-1, SHA-256, SHA-384, SHA-512

Web Crypto API предоставляет интерфейс SubtleCrypto, в котором реализован метод digest() для вычисления криптографических хеш-функций. В контексте браузеров поддерживаются следующие алгоритмы: SHA-1, SHA-256, SHA-384, SHA-512.

Метод вычисления хеша имеет форму:

crypto.subtle.digest(algorithm, data)

где:

  • algorithm — строка с названием хеш-функции
  • data — бинарные данные в виде ArrayBuffer или TypedArray
  • результат — Promise, возвращающий 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-1

  • Выход: 160 бит
  • Известные криптографические коллизии
  • Не рекомендуется для новых систем безопасности
  • В Web Crypto API сохранён исключительно для совместимости

SHA-256

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-256

  • Выход: 256 бит
  • Высокая устойчивость к коллизиям
  • Хороший баланс между скоростью и криптостойкостью
  • Стандарт де-факто для большинства криптографических систем

SHA-384

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-384

  • Более высокая криптографическая стойкость по сравнению с SHA-256
  • Оптимизирован для 64-битных систем
  • Используется в TLS и криптографических протоколах высокого уровня
  • Медленнее SHA-256, но безопаснее при длительном хранении секретов

SHA-512

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);

Характеристики SHA-512

  • Выход: 512 бит
  • Максимальная криптостойкость среди SHA-2 в API
  • Эффективен на 64-битных архитектурах
  • Применяется в системах с повышенными требованиями к безопасности

Обработка входных данных

Метод 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.

Hex-формат

function bufferToHex(buffer) {
    return Array.from(new Uint8Array(buffer))
        .map(b => b.toString(16).padStart(2, "0"))
        .join("");
}

Base64-формат

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 в Web Crypto API

Алгоритм Размер выхода Статус безопасности Основное применение
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);

Внутренние ограничения API

  • Поддерживаются только стандартизированные алгоритмы
  • SHA-1 доступен исключительно для обратной совместимости
  • Прямой доступ к промежуточным состояниям хеширования отсутствует
  • Потоковое хеширование не поддерживается (в отличие от Node.js crypto stream API)

Совместимость алгоритмов с протоколами

SHA-256, SHA-384 и SHA-512 интегрированы в современные криптографические стандарты:

  • TLS 1.2 и TLS 1.3
  • JWT (JSON Web Tokens)
  • WebAuthn
  • PKI инфраструктуры
  • HMAC (в связке с SubtleCrypto.sign)

SHA-1 встречается исключительно в устаревших системах и протоколах, где не обновлена криптографическая база.


Типичные ошибки при использовании digest()

Передача строки вместо ArrayBuffer

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.


Взаимодействие с другими частями Web Crypto API

Метод digest() часто используется как вспомогательный этап перед:

  • генерацией цифровых подписей (sign)
  • проверкой целостности сообщений
  • созданием уникальных идентификаторов
  • построением ключевых производных функций на уровне приложения