Русский

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

UUID на основе имени (v3 и v5): детерминированные идентификаторы из пространства имен

· Фон

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

Пространство имен и имя объединены, хешированы с помощью SHA-1, а полученные байты отформатированы как UUIDv5.
Оригинальная векторная иллюстрация ToolAcre

Когда одна и та же внешняя запись всегда должна иметь один и тот же идентификатор, случайные UUID не подходят. UUID версий 3 и 5 хэшируют пространство имен и имя в стабильный идентификатор; в этом посте объясняется, как и когда их использовать.

Повторный импорт одного и того же клиента дважды — проблема дублирования, которую решают детерминированные идентификаторы

Конвейер импорта данных получает записи о клиентах из внешней системы с внешними идентификаторами, стабильными в этой системе. Если вы генерируете новый случайный UUID для каждого запуска импорта, при двукратном импорте одного и того же клиента возникают два разных идентификатора и дублирующиеся записи. Это дублирование переходит в системы отчетности, выставления счетов и поддержки. Если вы получаете UUID из внешнего идентификатора клиента и стабильного пространства имен, представляющего ваш источник импорта, каждый импорт создает один и тот же UUID для одного и того же клиента, что позволяет вам идентифицировать и обновлять существующие записи. Этот детерминизм является определяющей характеристикой UUID v3 и v5: они не генерируются независимо, а извлекаются из входных данных, и один и тот же вход всегда создает идентичный UUID.

Пространство имен плюс имя — как входные данные объединяются и хэшируются, и почему пространство имен предотвращает конфликты между различными источниками.

UUID версии 3 или 5 состоит из трех компонентов: пространства имен UUID (обычно предопределенного), имени (любая байтовая строка) и алгоритма хэширования (MD5 для версии 3, SHA-1 для версии 5). Объедините 16 bytes пространства имен UUID с UTF-8 байтами имени, хешируйте конкатенацию, возьмите первый 16 bytes выходного хеш-кода и интерпретируйте эти байты как UUID с полубайтом версии, установленным на 3 или 5. Пространство имен разделяет пространство идентификаторов: UUID v5 из пространства имен DNS никогда не конфликтуют с UUID v5 из пространства имен URL. RFC 9562 определяет четыре предопределенных пространства имен: по имени DNS, по URL, по OID и по отличительному имени X.500. Организации могут создать собственное пространство имен, создав файл UUID версии 4.

MD5 в v3 и SHA-1 в v5 — почему здесь допустим ослабленный хэш, поскольку идентификатор не является элементом управления безопасностью

Версия 3 использует MD5, а версия 5 использует SHA-1, выбор датируется датами их спецификации и доступными реализациями. Для UUID на основе имени это различие несущественно, поскольку хеш-функция не является границей безопасности или криптографическим контролем. UUID не подтверждает подлинность или целостность; это просто преобразование строки переменной длины в фиксированное 128-битное значение. Модель атаки не имеет значения, поскольку UUID хранятся и сравниваются как непрозрачные значения, а не как доказательства или меры безопасности. В новых реализациях следует использовать версию 5 (SHA-1), а не версию 3 (MD5) не из соображений безопасности, а потому, что версия 5 является современным стандартом и широко доступна.

Предопределенные пространства имен — DNS, URL, OID и X.500, а также когда создавать свои собственные

RFC 9562 указывает ровно четыре предопределенных UUID пространства имен с конкретными байтовыми представлениями: 6ba7b810-9dad-11d1-80b4-00c04fd430c8 для DNS, 6ba7b811-9dad-11d1-80b4-00c04fd430c8 для URL-адресов, 6ba7b812-9dad-11d1-80b4-00c04fd430c8 для OID и 6ba7b814-9dad-11d1-80b4-00c04fd430c8 для OID. X.500 отличительные имена. Имя UUID версии 5, полученное из пространства имен DNS, и имя www.example.com всегда будут идентичны и никогда не будут конфликтовать с UUID версии 5 из пространства имен URL. Использование предопределенного пространства имен обеспечивает совместимость: если несколько команд независимо используют версию 5 с пространством имен DNS, они генерируют идентичные UUID для одних и тех же имен DNS. Выбор или создание пространства имен является частью проектирования схемы.

Рабочий пример — концептуальное получение v5 UUID из пространства имен URL и записи URL, шаг за шагом.

Концептуально выведите v5 UUID из пространства имен URL и имени https://example.com/api/users/42.. Пространство имен UUID как 16 bytes равно 6b a7 b8 11 9d ad 11 d1 80 b4 00 c0 4f d4 30 c8. Имя — это строка UTF-8 https://example.com/api/users/42,, то есть 30 bytes. Объедините байты пространства имен (16) и байты имени (30), чтобы получить всего 46 bytes. Вычислите хэш SHA-1, получив хеш размером 20 байт. Возьмите первый 16 bytes и интерпретируйте его как UUID с полубайтом версии, установленным в 5, и вариантными битами, установленными в стандарт RFC. Повторное вычисление с идентичными входными данными дает тот же результат. Большинство разработчиков используют свою языковую библиотеку UUID для вычислений v5.

Где шаблон нарушается — когда имена меняются, когда пространство имен несовместимо между командами и когда входные данные секретны

UUID на основе имени предполагают, что имя стабильно и единообразно в разных системах и при выполнении импорта. Если одна и та же внешняя запись имеет разные имена в разных системах, создание версии 5 из каждого имени создает разные UUID и не позволяет идентифицировать одного и того же человека. Если пространство имен не согласовано между командами (каждая команда создает собственное пространство имен для того, что на самом деле является одним и тем же источником), они генерируют разные UUID и не могут сопоставить записи. Если входные данные представляют собой конфиденциальные данные, создание UUID версии 5 означает, что UUID является общедоступным детерминированным значением, которое любой может найти, если знает входные данные. Детерминизм нарушается, когда входные данные изменяются или определения пространства имен несогласованы.

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

ToolAcre генерирует только UUID версии 4, полученные из криптографически безопасного генератора браузера для независимости. Для получения UUID на основе имени требуется библиотека вашего языка UUID или реализация, которая вычисляет SHA-1 и правильно форматирует результат. В этом посте объясняется концепция и варианты использования; реализация генерации v5 проста на любом языке с доступом к стандартным криптографическим библиотекам. Механика создания версии 5 проста; задача состоит в том, чтобы интегрировать его в схему системы, где пространство имен стабильно, имя согласовано, а подход хорошо документирован для вашей команды. Команды разработчиков должны документировать выбор пространства имен.

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

Используйте версию 5 для стабильного сопоставления внешних идентификаторов и ваших внутренних записей. Детерминизм предотвращает дублирование импорта и делает сопоставление записей в разных системах простым и надежным. Не используйте UUID на основе имени для идентификаторов, которые нельзя угадать, или для сценариев, требующих строгой конфиденциальности и секретов. ToolAcre генерирует случайные UUID версии 4 для идентификаторов, которые должны быть независимыми и разными без предсказуемости. Если вашим системам необходимы детерминированные идентификаторы, которые сопоставляют входные данные с фиксированными идентификаторами, библиотека вашего языка UUID может их вычислить. Детерминизм — мощная функция, когда вы контролируете входные данные.