Аут-код с A-Za-z0-9 для использования в параметре URL - PullRequest
2 голосов
/ 09 ноября 2009

Как часть веб-приложения, мне нужен код авторизации для передачи в качестве параметра URL. Я в настоящее время использую (в Rails): Digest :: SHA1.hexdigest ((object_id + rand (255)). To_s)

, который обеспечивает длинные строки, такие как: http://myapp.com/objects/1?auth_code=833fe7bdc789dff996f5de46075dcb409b4bb4f0

Однако это слишком долго, и я думаю, что, возможно, мне удастся «сжать» эту цепочку, используя более допустимые символы в URL-адресе, такие как весь верхний и нижний алфавит в дополнение к числам.

У вас есть фрагмент кода, который делает именно это?

Ответы [ 4 ]

1 голос
/ 10 ноября 2009
your_auth_code = Digest::SHA1.hexdigest((object_id + rand(255)).to_s)

your_shortened_code = your_auth_code.to_i(16).to_s(36)

Преобразует ваш auth_code из базы 16 (шестнадцатеричной) в базу 36, которая использует [0-9a-z] Лично я бы просто разрезал код на две части, если вы чувствуете, что он слишком длинный.

0 голосов
/ 14 ноября 2009

Это правильно: в моем приложении есть Пользователи, которые нажимают на ссылку в письме, содержащем код авторизации. Когда пользователь нажимает на ссылку, он попадает в веб-приложение, но не перенаправляется. Код авторизации останется в строке URL. У каждого из моих пользователей есть код авторизации. На карту поставлено то, что при столкновении два пользователя не могут быть различены друг от друга.

Благодаря вашему очень ценному вкладу я смог выяснить, что набрать в google, чтобы получить информацию по этой теме: "base 62".

Итак, я нашел камень base62: http://github.com/jtzemp/base62

А теперь моя формула:

Digest::SHA1.hexdigest((object_id + rand(255)).to_s).to_i(16).base62_encode.slice(0..10)

, который дает мне код авторизации, например: Fw1eDr701PY

Это хороший компромисс. Если мое приложение покоряет мир, я все равно могу добавить поиск в БД, чтобы избежать дублирования, но сейчас я буду придерживаться его.

0 голосов
/ 11 ноября 2009

Что делает gpaul, так это то, что хеш-функции по-прежнему являются хеш-функциями, даже если они усекаются, просто существует более высокая вероятность коллизии, хотя с только 10 битами это все еще довольно низкая частота коллизий. Если вы посмотрите на bit.ly, например, их хэши совершенно незначительны, но, как вы заметили, они используют base-32 вместо base-16, это не имеет большого значения.

Важно, чтобы вы спросили, что грозит риском, если люди сталкиваются, потому что даже с полным SHA1 есть шанс (криптографически невозможный). Если на самом деле нет большой опасности, я думаю, вы можете сократить до 5-10 символов.

Но все еще остается вопрос, почему это важно. В ваших электронных письмах, по-видимому, вы отправляете ссылку, которую люди просто нажимают на правильную? Может быть, будет лучший вариант, если вы скажете нам, почему URL слишком длинный.

0 голосов
/ 10 ноября 2009

Предоставлено моим коллегой:

  CHARS = [*'a'..'z'] + [*'A'..'Z'] + [*0..9]
  def create_token
    self.token = (0..9).map { CHARS[rand(CHARS.size)] }*''
  end

Также есть один, который использует кучу символов ascii из диапазона 32+, но он не подходит для вашего варианта использования (URL) из-за недопустимых символов, но вы можете использовать его для соли пароля и т. Д. Это любезно Джеймса Бака:

Array.new(32) { 32 + rand(95) }.pack("C*")

С этими двумя фрагментами вы, вероятно, сможете настроить его под свои нужды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...