Шифрование 6-значного числа в другое 6-значное число в c # - PullRequest
0 голосов
/ 08 сентября 2011

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

id=196
encryptedid=345
randno=234
encryptedrandno=456
id=encryptedid+encryptedrandno
link: id
so when user clikcs that link at backend 
id=id-encryptedrandno(which gives us encryptedid)
id=decrypt(id)

Пожалуйста, расскажите мне эту логику, я использую веб-приложение c #

1 Ответ

6 голосов
/ 08 сентября 2011

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

Самый простой способ эффективного созданияВероятно, что бимэп между значениями должен создать список значений 0-999 и перемешать его (некоторым воспроизводимым способом).Затем вы «зашифруете», взяв значение по определенному индексу, и «расшифруйте», найдя индекс этого значения:

int id = ...;
int encrypted = shuffledValues[id];
int decrypted = shuffledValues.IndexOf(encrypted);

Вы можете сделать «дешифрование» намного быстрее, построив словарь, имейте в виду:

Dictionary<int, int> decryptionDictionary =
    shuffledValues.Select((value, index) => new { value, index })
                  .ToDictionary(p => p.value, p => p.index);

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

В отличие от почти любого другого вопроса безопасности, я думаю, что в этом случае этобыло бы неплохо просто использовать System.Random для перетасовки - но это не потому, что Random обычно подходит для использования в целях безопасности;это потому, что у вас такой ужасно маленький диапазон потенциальных значений для начала.

Я бы серьезно попытался отойти от использования трехзначных идентификаторов.

Альтернативный подход заключается в создании нового идентификатора GUID.В вашей базе данных сохраните исходный идентификатор и сгенерированный GUID и передайте GUID обратно клиенту (например, по ссылке).Когда вы получаете GUID, вы можете выполнить запрос в базе данных, чтобы получить исходные данные.

РЕДАКТИРОВАТЬ: даже 6-значные идентификаторы не будут намного лучше, чем исходные 3. Легко попробовать каждыйодин из миллиона цифр, поэтому атака может быстро перейти на любую возможную ссылку.Получая десять ссылок в секунду, они смогут получить их все менее чем за два дня.Даже с ограничением скорости вы по-прежнему далеки от безопасности.

Другими словами: если кто-то попросил вас выбрать пароль для веб-сайта, но сказал, что он должен быть шестизначным, насколько он защищен?Вы бы чувствовали?

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