Кодирование двух значений в токене короткого URL - PullRequest
0 голосов
/ 14 марта 2012

Я работаю над приложением с коротким URL, в котором токен должен идентифицировать 2 значения: идентификатор ссылки и идентификатор пользователя. В идеале этот токен должен быть коротким.

Например, учитывая URL http://sho.rt/15qq6,, токен "15qq6" должен идентифицировать ссылку и идентификатор пользователя.

Полагаю, один из вариантов - вставить оба значения в таблицу и использовать автоматически сгенерированный идентификатор в качестве токена, но я бы не стал. Я бы предпочел решение, включающее шифрование.

Как я могу использовать классы шифрования .NET для таких целей, если это возможно? Большое спасибо за вашу помощь.

Ответы [ 6 ]

3 голосов
/ 14 марта 2012

Мне не ясно, насколько коротким вы хотите свой код. Я разместил в сети код для шифрования любого количества аргументов запроса .

Результат может быть сокращен путем кодирования base64 результата. Это все еще может быть недостаточно коротким для вас, хотя. (Обратите внимание, что я не кодировал base64, потому что у меня были некоторые опасения по поводу кодирования base64 с учетом регистра.)

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

3 голосов
/ 14 марта 2012

Не думаю, что вы точно понимаете, как работает шифрование.

Шифрование - это просто метод, который затрудняет декодирование ответа, не зная оригинального ключа шифрования.

Зашифрованные данные имеют длину не менее исходных, если не больше. Не существует приемлемого способа кодирования URL-адреса в меньший объем данных, который все еще действует в URL-адресе.

Используйте для этого базу данных, вот для чего они.

Edit: D'Oh, Андрей побил меня с лучшим откликом после редактирования.

3 голосов
/ 14 марта 2012

Короткий ответ: «Вы не можете», по крайней мере, не легко.

Шифрование обычно не меняет длину зашифрованных данных. Поэтому, если вы возьмете URL и UserId, которые хотите кодировать и зашифровать их, вы получите токен одинаковой общей длины.

Вы можете попробовать сжать данные перед шифрованием, но в одном URL-адресе не так много избыточности, и это не будет вам выгодно.

Вы хэшируете данные, чтобы получить более короткий результат, но нет способа отменить этот процесс, чтобы получить ваш URL и идентификатор пользователя.

Если вам нужен короткий токен, то единственная реальная опция, о которой я могу подумать, - это таблица поиска на сервере, использующая токен в качестве ключа.

2 голосов
/ 14 марта 2012

Вы можете использовать что-то вроде RNGCryptoServiceProvider для генерации уникального набора символов. Используйте несколько строк констант, содержащих диапазон символов, таких как «a» - «z», «A» - «Z» и «1» - «9». Сохраните буквенно-цифровую строку со случайным смешанным регистром с исходным URL и идентификатором пользователя.

1 голос
/ 14 марта 2012

Если вам не нужно шифрование, то простая комбинация Convert.ToBase64String и BitConverter.GetBytes даст вам разумную строку. Обратите внимание, что Base64 использует некоторые не-url-символы, поэтому рассмотрите возможность их замены в результате WikiPedia Base64 или используйте кодировку Base32.

int first =1234;
int second =789;
var encoded = Convert.ToBase64String(
        BitConverter.GetBytes (((ulong)first<<32)+(ulong)second));
1 голос
/ 14 марта 2012

Создать случайный токен и сохранить ссылку и идентификатор пользователя в дБ для этого токена. Это достаточно безопасности.

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