crypto.randomUUID

crypto.randomUUID — встроенный метод Web Crypto API, предназначенный для генерации криптографически стойких идентификаторов UUID версии 4. Метод является частью пространства имен crypto и доступен в современных браузерах и средах, реализующих спецификацию Web Crypto.

UUID (Universally Unique Identifier) используется для создания уникальных идентификаторов объектов, сессий, записей, ключей и других сущностей, где требуется высокая вероятность уникальности без централизованной координации. В отличие от самописных генераторов на основе Math.random(), данный метод опирается на криптографически безопасный генератор случайных чисел операционной системы.


Метод не принимает аргументов и возвращает строку:

crypto.randomUUID()

Результат соответствует формату UUID v4:

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

где:

  • x — случайные шестнадцатеричные символы
  • 4 — фиксированный номер версии UUID
  • y — определяет вариант (вариант RFC 4122)

Пример значения:

3b12f1df-5232-4f6b-9a3c-7c2d2d1c8f1a

Криптографическая основа генерации

Внутри реализации используется CSPRNG (Cryptographically Secure Pseudo-Random Number Generator), предоставляемый операционной системой через Web Crypto API. Это делает результат:

  • непредсказуемым
  • устойчивым к статистическому анализу
  • пригодным для идентификаторов в защищённых системах

Генерация не зависит от времени, состояния приложения или seed, доступного разработчику.


Структура UUID v4

UUID версии 4 строго определяет расположение битов:

  • 128 бит общей длины
  • 6 фиксированных бит версии и варианта
  • остальное — случайные данные

Формат разбит на 5 групп:

8-4-4-4-12 символов

Пример:

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

Где:

  • третий блок начинается с 4 (версия)
  • четвертый блок начинается с 8, 9, a или b (вариант RFC 4122)

Применение в веб-разработке

Идентификаторы сущностей

Используется для генерации уникальных ID:

const userId = crypto.randomUUID();
const sessionId = crypto.randomUUID();
const messageId = crypto.randomUUID();

В отличие от инкрементных идентификаторов:

  • не требует синхронизации
  • не раскрывает порядок создания
  • не позволяет угадывать количество сущностей

Ключи для структур данных

const cache = new Map();

const key = crypto.randomUUID();
cache.set(key, { data: "value" });

Клиентские временные сущности

В интерфейсах приложений UUID часто используется до синхронизации с сервером:

const tempItem = {
  id: crypto.randomUUID(),
  text: "Новая задача",
  synced: false
};

Сравнение с альтернативами

Math.random()

Недостатки:

  • не криптографически безопасен
  • возможны коллизии при больших объемах
  • предсказуем при известных seed-условиях
const id = Math.random().toString(36).slice(2);

Такой подход не гарантирует глобальную уникальность.


UUID через сторонние библиотеки

Библиотеки типа uuid:

import { v4 as uuidv4 } from "uuid";
uuidv4();

Преимущества crypto.randomUUID():

  • встроенность в платформу
  • отсутствие зависимостей
  • более высокая производительность
  • использование системного CSPRNG

Производительность

Метод реализован на уровне движка браузера и использует нативные механизмы генерации случайных байтов. В большинстве случаев он:

  • быстрее JavaScript-реализаций UUID
  • не требует дополнительных вычислений
  • не создает накладных зависимостей

Поддержка платформ

Поддерживается в:

  • Chrome (современные версии)
  • Firefox
  • Edge
  • Safari (новые версии)
  • Node.js (начиная с определённых версий, через глобальный crypto)

Проверка доступности:

if (crypto.randomUUID) {
  const id = crypto.randomUUID();
}

Безопасность

Метод подходит для:

  • идентификаторов сессий
  • токенов отслеживания
  • временных ключей доступа (в сочетании с серверной проверкой)

Но не предназначен для:

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

Причина: UUID предназначен для уникальности, а не для секретности.


Ограничения

  • отсутствие параметров конфигурации
  • фиксированный формат UUID v4
  • невозможность задать seed или источник случайности
  • отсутствие контроля энтропии на уровне API

Типичные ошибки использования

Использование как криптографического секрета

const password = crypto.randomUUID(); // недопустимо

UUID не предназначен для хранения секретной информации.


Использование как сортируемого идентификатора

UUID v4 не содержит временной компоненты, поэтому:

  • не сортируется по времени
  • не отражает порядок создания

Поведение при коллизиях

Теоретическая вероятность коллизии UUID v4 крайне мала из-за объема пространства 128 бит. Практически при корректной реализации CSPRNG вероятность столкновения пренебрежимо мала даже при миллиардах генераций.


Взаимодействие с Web Crypto API

Метод является частью crypto объекта, который также включает:

  • crypto.getRandomValues()
  • crypto.subtle (криптографические операции)

randomUUID() является высокоуровневым удобным методом, построенным поверх генератора случайных значений.


Использование в архитектуре приложений

В распределённых системах UUID часто используется для:

  • корреляции событий
  • идентификации запросов
  • логирования
  • трассировки
const requestId = crypto.randomUUID();
console.log("Request:", requestId);

Генерация UUID вручную (для понимания)

Низкоуровневый эквивалент с использованием getRandomValues:

function uuidv4() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, "0"));

  return (
    hex.slice(0, 4).join("") + "-" +
    hex.slice(4, 6).join("") + "-" +
    hex.slice(6, 8).join("") + "-" +
    hex.slice(8, 10).join("") + "-" +
    hex.slice(10, 16).join("")
  );
}

crypto.randomUUID() выполняет аналогичную задачу на уровне движка, но без необходимости ручной реализации.


Практические сценарии в современных приложениях

  • генерация ID компонентов UI
  • ключи React/Vue списков
  • идентификаторы сообщений в чатах
  • offline-first приложения
  • локальные базы данных (IndexedDB)
  • event-driven архитектуры на клиенте