Web Crypto API

Криптография в браузере: хэширование, шифрование, цифровые подписи через crypto.subtle.

Что это

Глобальный объект crypto доступен в браузере и Web Workers. Сердце — crypto.subtle (SubtleCrypto): асинхронные операции хэширования (SHA-1/256/384/512), симметричного/асимметричного шифрования (AES, RSA), HMAC, цифровых подписей, генерации/импорта ключей. Работает только в secure context (HTTPS или localhost).

Базовое использование

// SHA-1 хэш строки (для Podcast)
const text = 'episode-title';
const data = new TextEncoder.encode(text);
const buf = await crypto.subtle.digest('SHA-1', data);
const hex = [...new Uint8Array(buf)]
  .map((b) => b.toString(16).padStart(2, '0'))
  .join('');
// → "a4d8c1..."

// SHA-256
const hash = await crypto.subtle.digest('SHA-256', data);

// Случайные байты (sync, не через subtle)
const bytes = crypto.getRandomValues(new Uint8Array(16));

// UUID
const id = crypto.randomUUID; // '7c..-..-..-..-..'

Основные методы

Метод Что делает
crypto.subtle.digest(algo, data) Хэш SHA-1/256/384/512
crypto.subtle.encrypt/decrypt AES-GCM, RSA-OAEP
crypto.subtle.sign/verify HMAC, ECDSA, RSA-PSS
crypto.subtle.generateKey Генерация CryptoKey
crypto.subtle.importKey/exportKey Импорт/экспорт ключей
crypto.getRandomValues(typedArray) CSPRNG, sync
crypto.randomUUID UUID v4

Поддержка браузерами

  • Все современные браузеры, Node.js 15+
  • Требует HTTPS или localhost (secure context)
  • В Node.js: globalThis.crypto или import { webcrypto } from 'node:crypto'

Подводные камни

  • SHA-1 криптографически слаб (но достаточен для guid-генерации в Podcast)
  • Все методы subtle.* асинхронные, возвращают Promise
  • На HTTP (не localhost) crypto.subtle будет undefined
  • Результат digestArrayBuffer, требует ручной конвертации в hex/base64

Используется в bootcamp

  • Podcast Player — генерация GUID для эпизода RSS-фида через SHA-1 от ссылки/заголовка

Ссылки

🎓 Источники

См. также