Надежный хеш-подобный идентификатор
Мне нужно сгенерировать идентификатор длиной 6 символов (буквы и цифры), чтобы определить рабочее пространство SaaS (уникальное для каждого пользователя). Конечно, я мог бы просто использовать цифры, но они не должны давать четкого представления о реальном числе рабочих мест (для конечного пользователя).
Так что даже для идентификатора 1 он должен быть длиной 6 символов и что-то вроде fX8gz6
и полностью декодируемый 1
или же 000001
или что-то, что я могу разобрать с реальным идентификатором рабочей области. И, конечно, он должен быть защищен от столкновений.
Что будет лучшим подходом для этого?
1 ответ
Это похоже на то, что Amazon использует для своих облачных активов, но использует 8 символов. На самом деле подходит 8 символов, поскольку это выходной диапазон после кодирования Base64 6 двоичных байтов.
Предполагая, что у вас есть возможность использовать 8 символов. В оригинальном вопросе вы сказали 6 символов, но опять-таки при условии. Вот возможная схема:
- Количество ваших активов в
Unsigned Int32
возможно автоматическое приращение моды. назови этоreal-id
, Используйте этот реальный идентификатор для всех своих внутренних целей. - Когда вам нужно отобразить его, выполните что-то вроде этого:
- Преобразуйте ваше целое число в 4 двоичных байта. Каждый язык имеет библиотеку для извлечения байтов из целых чисел и наоборот. Назови это
real-id-bytes
- взять двухбайтовое случайное число. Опять же, вы можете использовать библиотеки для генерации точного 16-битного случайного числа. Вы можете использовать криптографические генераторы случайных чисел для лучшего результата, или простой
rand
просто отлично. Назови этоrand-bytes
- Получить 6 байт
display-id-bytes
= array-concat(rand-bytes, real-id-bytes)
- получать
display-id
= Base64(display-id-bytes)
, Это ровно 8 символов длиной и состоит из строчных, прописных букв и цифр.
Теперь у вас есть 8 случайных символов display-id
которые могут быть сопоставлены с real-id
, Чтобы конвертировать обратно:
- Взять 8 символов
display-id
display-id-bytes
= Base64Decode(display-id)
real-id-bytes
= Discard-the-2-random-bytes-from(display-id-bytes)
real-id
= fromBytesToInt32(real-id-bytes)
Просто. Теперь, если вы действительно не можете использовать 8-символьный display-id, вам нужно разработать несколько пользовательских base-64, таких как algo. Также вы можете ограничить себя только 1 случайным байтом. Также обратите внимание, что это просто схема кодирования, а не схема шифрования. Таким образом, любой, кто знает вашу схему, может эффективно взломать / расшифровать идентификатор. Вы должны решить, является ли это приемлемым или нет. Если нет, то я думаю, что вы должны сделать какую-то форму шифрования. Что бы это ни было, конечно, 6-символьный будет далеко недостаточно.