Генерация пользовательского кода 1 временного купона - PullRequest
7 голосов
/ 13 октября 2008

Так что мне нужно сгенерировать код, который можно привязать к конкретному пользователю / потенциальному клиенту со встроенной суммой в долларах. Он должен быть обратимым, чтобы клиентское приложение могло подтвердить правильность кода и применить скидку, которую намерен менеджер.

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

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

Я делаю это в C #, но ожидаю, что методы с любого языка могут быть переведены.

редактирование: уточнить. Я не могу хранить эти вещи заранее, коды должны быть созданы на лету и нести всю информацию с собой.

например. Продавец 14 звонит по поводу клиента 773 и хочет дать ему $ 500 от их заказа. 14, 773 и 500 должны быть в коде купона и могут быть извлечены в клиентском приложении после того, как продавец введет код.

Ответы [ 7 ]

7 голосов
/ 13 октября 2008

Создание пары открытый / закрытый ключ для подписи. В цифровой форме подписать комбинацию идентификатора пользователя и стоимости купона с помощью закрытого ключа. Опубликуйте значение купона + подпись в виде кода купона, закодированного, например, с использованием букв и цифр. Клиентское приложение будет проверять код путем воссоздания комбинации данных, которые были первоначально подписаны (например, добавление идентификатора пользователя к значению купона), а затем проверки цифровой подписи.

5 голосов
/ 13 октября 2008

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

Я бы создал класс купона, который сериализуется в XML, а затем зашифровал строку XML. Проверка будет состоять в том, чтобы расшифровать строку и посмотреть, является ли она действительной xml (я рекомендую не десериализовать объект, не проверив это раньше).

2 голосов
/ 13 октября 2008

Насколько умны ваши продавцы (или женщины)? Не могли бы вы просто зашифровать значение 64?

Проверьте здесь, как base64 кодировать и декодировать:

http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/

Кроме этого, я бы зашифровал значение с помощью ключа, известного вам и клиентскому приложению.

2 голосов
/ 13 октября 2008

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

1 голос
/ 20 апреля 2009

Стив Гибсон говорит об одноразовых паролях на своем веб-сайте, но нет причин, по которым вы не могли бы использовать его для создания одноразовых кодов купонов: http://grc.com/ppp

1 голос
/ 13 октября 2008

Это просто, чтобы подытожить ответы до сих пор. Существует два основных способа генерации таких кодов купонов:

  1. Централизованное решение: информация о каждом купоне хранится в вашей базе данных. Код купона может быть сгенерирован случайным образом и коротким - это просто ссылка на запись в вашей базе данных, которая содержит всю необходимую информацию, такую ​​как значение купона, идентификатор клиента, идентификатор представителя. Для проверки такого кода требуется онлайн-доступ к вашим серверам.

  2. Децентрализованное решение: купон представляет собой отдельную информацию, которую можно проверить в автономном режиме, не обращаясь к любому из ваших серверов. В результате код купона должен содержать некоторую (или даже всю) информацию. Наиболее безопасный способ - использовать асимметричную криптографию или код аутентификации сообщений , чтобы никто, кроме владельца закрытого ключа (вы), не мог генерировать купоны.

1 голос
/ 13 октября 2008

Полагаю, из того, как вы сформулировали вопрос, не хотите хранить коды в базе данных (если вы это сделали, вы могли бы просто проверить каждый код в базе данных)

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

Таким образом, предположим, что вам нужен купон для пользователя 23 стоимостью 200 долларов, вы можете создать строку типа «23_200» и вычислить хеш MD5 с секретной солью «BillTheLizard», чтобы получить 2671519131e974ee6fc746151e98f4a8, то есть полный код, который вы даете клиент 200_23_2671519131e974ee6fc746151e98f4a8

Теперь, когда вы получили код, вы разбиваете его на части и проверяете, что md5 ("200_23" + secret) = 2671519131e974ee6fc746151e98f4a8, чтобы проверить значение

Редактировать: если хэш 32 символа слишком длинный, вы всегда можете его обрезать, например, сокращение до 8 символов по-прежнему даст вам 4294967296 различных значений хеш-функции.

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