С тремя цифрами (теперь шесть после редактирования вопроса) у вас есть очень маленький исходный и целевой домен - я надеюсь, что это не для чего-то важного.
Самый простой способ эффективного созданияВероятно, что бимэп между значениями должен создать список значений 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. Легко попробовать каждыйодин из миллиона цифр, поэтому атака может быстро перейти на любую возможную ссылку.Получая десять ссылок в секунду, они смогут получить их все менее чем за два дня.Даже с ограничением скорости вы по-прежнему далеки от безопасности.
Другими словами: если кто-то попросил вас выбрать пароль для веб-сайта, но сказал, что он должен быть шестизначным, насколько он защищен?Вы бы чувствовали?