2015-02-25 6 views
1

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

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

Какой был бы лучший подход для этого?

+0

6 символов - это жесткий предел, или вы можете быть гибким, как 8 символов или 10 символов? – inquisitive

+0

@inquisitive извините за мой поздний ответ, и да: 6 был всего лишь примером, 8 символов полностью прекрасны – plunntic

ответ

0

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

+0

нет необходимости в каком-либо шифровании, это просто, чтобы пользователь не знал о реальном номере id, в случае, если кто-то пытается угадать или взломать любой существующий идентификатор будет 404 (если нет привилегий для этой определенной рабочей области) – plunntic

+0

штраф, тогда такая схема должна работать на вас. Такие шаги, как extracting-bytes, random-number, base64 и т. Д., Очень удобны в dot-net и java со встроенными библиотеками. вы никогда не говорили, какой язык вы используете. – inquisitive

+0

также, насколько я понимаю, эти 2-случайные байты всегда должны быть двумя байтами байта display-id-байтов, поэтому, когда вы делаете discard-2-random-bytes, я просто удаляю два первых байта, и все? – plunntic

 Смежные вопросы

  • Нет связанных вопросов^_^