Русский

Инструменты разработчика · Генератор UUID

Как crypto.getRandomValues превращает 16 случайные байты в v4 UUID

· Как это работает

uuid криптография API-интерфейс браузера

Шестнадцать случайных байтов с выделенными битовыми полями версии и варианта.
Оригинальная векторная иллюстрация ToolAcre

Версия 4 UUID — это 16 bytes из криптографически безопасного генератора с перезаписанными шестью битами. В этом посте байты вызова Web Crypto переходят к знакомой строке символов 36.

Идентификатор, который вам нужен до того, как сервер ответит — почему генерация на стороне клиента возникает в оффлайн-формах, оптимистичном пользовательском интерфейсе и пакетном импорте

Автономной форме может потребоваться идентификатор, прежде чем сервер ответит, а оптимистичный пользовательский интерфейс может создать несколько объектов одновременно. UUIDv4 предназначен для независимой генерации без центрального счетчика. Это не подтверждение личности пользователя или секрет, который можно безопасно использовать вместо аутентификации. Если вашей базе данных требуются значения, сортируемые по времени создания, случайные идентификаторы версии 4 не упорядочиваются; это отдельное решение схемы, а не повод ослабить их случайность.

Что на самом деле делает crypto.getRandomValues — заполняет типизированный массив из источника энтропии операционной системы, а не из формулы JavaScript

crypto.getRandomValues заполняет Uint8Array 16 bytes из криптографически безопасного генератора случайных чисел платформы браузера. Он не извлекает значения из Date.now() или Math.random(). Операционная система и браузер реализуют базовый источник энтропии, поэтому код JavaScript получает байты, а не реализует саму формулу случайных чисел. ToolAcre отказывается генерировать идентификатор, если его безопасный источник отсутствует.

Перезапись байта 6 и байта 8 — как полубайт версии становится 4, а биты варианта — 10xx, и почему теряется только шесть битов

RFC 9562 описывает полубайт версии и поле варианта. Начиная с шестнадцати случайных байтов, установите старшие четыре бита байта 6 в двоичный 0100 (версия 4), а два старших бита байта 8 установите в 10 (стандартный вариант). Реализация использует (byte6 и 0x0f) | 0x40 и (байт8 и 0x3f) | 0x80. Шесть бит перезаписываются, оставляя 122 случайных битов по схеме UUIDv4. Эти постоянные биты не делают оставшиеся байты менее случайными.

От байтов до 8-4-4-4-12 — шестнадцатеричное кодирование, вывод в нижнем регистре и размещение дефиса в соответствии со стандартом.

При необходимости закодируйте каждый байт как два шестнадцатеричных символа с ведущим нулем. Вставьте тире после 4, 6, 8 и 10 bytes, получив знакомые 8-4-4-4-12 группы шестнадцатеричных символов. Действительная строка версии 4 имеет 4 в начале третьей группы и один из 8, 9, a или b в начале четвертой. Форматирование не добавляет энтропии; он только делает базовое 128-битное значение совместимым с инструментами, которые ожидают текстовую форму UUID.

Рабочий пример: один буфер размером 16 отслеживается посредством маскировки и форматирования до его конечной строки UUID.

Проследите иллюстративные байты 00 11 22 33 44 55 F6 77 38 99 AA BB CC DD ЭЭ ФФ. Маскирование F6 в байте 6 дает 46; маскирование 38 в байте 8 дает B8. После шестнадцатеричного форматирования строчными буквами и дефисов результатом будет 00112233-4455-4677-b899-aabbccddeeff. Это намеренно фиксированный обучающий пример, а не идентификатор для повторного использования в производстве. Создайте новую версию для каждого реального объекта и самостоятельно сравните позиции версий и вариантов.

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

В безопасном источнике crypto.randomUUID() выполняет генерацию и форматирование версии 4 за один вызов. ToolAcre использует его там, где это возможно, а в противном случае возвращается к getRandomValues ​​с явными битовыми операциями, указанными выше. Доступность браузера зависит от контекста: значение randomUUID ограничено безопасными контекстами, а значение getRandomValues ​​все еще может существовать на странице HTTP LAN. Ни одна из веток не возвращается к Math.random просто для того, чтобы кнопка оставалась работоспособной.

Что здесь не распространяется — версии на основе времени (v1, v7) и имени (v3, v5), которым требуются другие входные данные, чем случайные байты.

Этот механизм не описывает идентификаторы v1 или v7 на основе времени, идентификаторы v3/v5 на основе имени или экспериментальные макеты v8. Случайные UUID имеют очень низкую вероятность столкновения с абсолютной случайностью, а не с абсолютной математической невозможностью столкновения. Сам по себе v4 UUID не следует использовать в качестве токена проверки контроля доступа или сброса пароля без независимого учета секретности, срока действия и авторизации.

Вывод: безопасная случайность — это вся работа: генератор ToolAcre UUID извлекает данные из того же браузера CSPRNG, поэтому вы копируете то, что будет создавать ваш код.

Надежная случайность — это работа. Генератор ToolAcre UUID использует CSPRNG браузера, применяет биты версии и варианта и предлагает проверку правильности скопированных значений. Сравните сгенерированный результат с примером расположения байтов, а затем используйте новый уникальный вывод только для той роли, которую фактически назначило ему ваше приложение.