Утилиты
UUID и случайные токены
UUID v4, hex, base64 и PIN — по одному или сотнями.
122 бита: 128 случайных бит минус 6 бит на версию и вариант.
Что такое UUID v4
UUID (universally unique identifier) — 128-битный идентификатор, который записывают
тридцатью шестью символами: восемь групп через дефис, например
3f2a9c1e-7b4d-4f6a-9e21-8c5d0b7a4e13. Четвёртая версия стандарта
означает, что почти все биты в нём случайны.
Из 128 бит шесть зарезервированы: четыре бита уходят на номер версии (в третьей группе
всегда стоит 4), два — на вариант RFC 4122 (четвёртая группа начинается
с 8, 9, a или b). Остаются
122 случайных бита — это примерно 5,3 × 10³⁶ вариантов.
Главное свойство UUID — его можно создать где угодно без координации с сервером. Два независимых приложения почти никогда не выдадут одинаковый идентификатор, поэтому UUID удобно генерировать на клиенте ещё до записи в базу.
Где применяют UUID и токены
- первичные ключи таблиц, когда автоинкремент мешает или выдаёт размер базы;
- идентификаторы запросов для логов и трассировки между сервисами;
- ключи идемпотентности для повторных запросов к API;
- имена временных файлов, папок и сессий;
- hex- и base64-токены для ссылок сброса пароля и приглашений;
- PIN-коды для локальной проверки — например, в демо-стенде.
Чем UUID отличается от случайной строки
Случайная строка — это просто набор знаков без обязательств. UUID — стандарт:
фиксированная длина, каноническая запись, номер версии и варианта внутри, готовая
поддержка в библиотеках любого языка. Если значение должно читаться стандартными
парсерами и храниться в колонке uuid, берите UUID.
Если нужен именно токен — для ссылки, ключа API или имени файла — формат свободнее. Hex удобен тем, что состоит только из цифр и латинских букв a–f и не требует экранирования. Base64 плотнее: шесть бит на символ вместо четырёх, поэтому строка той же стойкости короче на четверть.
Сколько энтропии в токене
Энтропия токена считается как длина × log₂(алфавит). Для PIN-кода
алфавит — десять цифр, поэтому даже 12 знаков дают всего около 40 бит: такой код
защищает от случайного подбора, но не от целенаправленного перебора.
| Тип | Расчёт | Энтропия |
|---|---|---|
| UUID v4 | 122 случайных бита | 122 бита |
| HEX, 16 байт | 16 × 8 | 128 бит |
| HEX, 32 байта | 32 × 8 | 256 бит |
| Base64, 32 знака | 32 × 6 | 192 бита |
| PIN, 6 цифр | 6 × log₂(10) | ≈ 20 бит |
| Своя строка, 24 знака из 32 | 24 × 5 | 120 бит |
Как обращаться с токенами
- для сессий и API — не меньше 128 бит энтропии;
- для одноразовых ссылок — короткий срок жизни важнее длины;
- храните на сервере хеш токена, а не сам токен;
- не пишите токены в логи и в аналитику;
- PIN — только для локальной проверки, не для доступа к данным.