Надежный хеш-подобный идентификатор

Мне нужно сгенерировать идентификатор длиной 6 символов (буквы и цифры), чтобы определить рабочее пространство SaaS (уникальное для каждого пользователя). Конечно, я мог бы просто использовать цифры, но они не должны давать четкого представления о реальном числе рабочих мест (для конечного пользователя).

Так что даже для идентификатора 1 он должен быть длиной 6 символов и что-то вроде fX8gz6 и полностью декодируемый 1 или же 000001 или что-то, что я могу разобрать с реальным идентификатором рабочей области. И, конечно, он должен быть защищен от столкновений.

Что будет лучшим подходом для этого?

1 ответ

Решение

Это похоже на то, что Amazon использует для своих облачных активов, но использует 8 символов. На самом деле подходит 8 символов, поскольку это выходной диапазон после кодирования Base64 6 двоичных байтов.

Предполагая, что у вас есть возможность использовать 8 символов. В оригинальном вопросе вы сказали 6 символов, но опять-таки при условии. Вот возможная схема:

  1. Количество ваших активов в Unsigned Int32 возможно автоматическое приращение моды. назови это real-id, Используйте этот реальный идентификатор для всех своих внутренних целей.
  2. Когда вам нужно отобразить его, выполните что-то вроде этого:
  3. Преобразуйте ваше целое число в 4 двоичных байта. Каждый язык имеет библиотеку для извлечения байтов из целых чисел и наоборот. Назови это real-id-bytes
  4. взять двухбайтовое случайное число. Опять же, вы можете использовать библиотеки для генерации точного 16-битного случайного числа. Вы можете использовать криптографические генераторы случайных чисел для лучшего результата, или простой rand просто отлично. Назови это rand-bytes
  5. Получить 6 байт display-id-bytes= array-concat(rand-bytes, real-id-bytes)
  6. получать display-id= Base64(display-id-bytes), Это ровно 8 символов длиной и состоит из строчных, прописных букв и цифр.

Теперь у вас есть 8 случайных символов display-id которые могут быть сопоставлены с real-id, Чтобы конвертировать обратно:

  1. Взять 8 символов display-id
  2. display-id-bytes= Base64Decode(display-id)
  3. real-id-bytes= Discard-the-2-random-bytes-from(display-id-bytes)
  4. real-id= fromBytesToInt32(real-id-bytes)

Просто. Теперь, если вы действительно не можете использовать 8-символьный display-id, вам нужно разработать несколько пользовательских base-64, таких как algo. Также вы можете ограничить себя только 1 случайным байтом. Также обратите внимание, что это просто схема кодирования, а не схема шифрования. Таким образом, любой, кто знает вашу схему, может эффективно взломать / расшифровать идентификатор. Вы должны решить, является ли это приемлемым или нет. Если нет, то я думаю, что вы должны сделать какую-то форму шифрования. Что бы это ни было, конечно, 6-символьный будет далеко недостаточно.

Другие вопросы по тегам