Создать набор «кодов купонов» на основе алгоритма;нет необходимости хранить коды - PullRequest
8 голосов
/ 11 мая 2011

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

Мы создаем так много таких карточек, причем их так мало на самом деле, что я хотел бы использовать какой-либо способ идентификации действительного кода с использованием метода, а не хранить каждый отдельный код в базе данных. Мы создаем, скажем, 5000 таких кодов одновременно. Вероятно, около 5 раз в год.

В идеале я бы хотел иметь что-то вроде:

$coupons->generate(5000, 'unique_salt', 'prefix_');

Что бы генерировать 5000 "случайных" кодов, таких как:

prefix-23-3424-4324-3344 or
prefix-4H-34RE-22K3-PE3W

unique salt и prefix_ будут сохранены в базе данных. Эти коды затем можно будет проверить с помощью prefix_ для поиска salt и определения кода как действительного или нет.

У меня есть такая форма работы: я использую число в качестве соли, чтобы найти числа, делимые на соль, а затем переставить цифры так, чтобы они казались случайными. При наличии достаточно длинных кодов потребуется определенная работа, чтобы выяснить закономерность. Но я хотел бы думать, что есть лучший способ ... так как есть только так много чисел, которые дают большое количество кодов, которые делятся на salt.

(Например, соль 2 даст 5000 кодов от 1 до 10000 (и будет легко увидеть шаблон) ... но соль 14000 даст ноль кодов от 1 до 10000)

Другим преимуществом этого является то, что я могу генерировать купоны по мере необходимости (например, когда мы даем людям скидку один за другим), и иметь возможность отслеживать, какие купоны используются, когда и т. Д. На основе prefix_ ... и, возможно, посмотрите, как / когда раздают карты, что дает лучший возврат.

Должен ли я просто крутить свои колеса, когда я должен просто хранить каждый код в базе данных? (Или просто веселились?):)

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

то, что вы ищете, называется Partial Key Verification, как и серийные номера на компакт-дисках с программным обеспечением:)

Посмотрите:

http://47hats.com/2007/07/implementing-a-partial-serial-number-verification-system/

http://www.codeproject.com/KB/security/cdkeys.aspx

http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/

Приветствия

2 голосов
/ 11 мая 2011

Вы можете сделать это, используя HMAC и соответствующую схему кодирования.Сначала создайте секретный ключ для HMAC и убедитесь, что вы храните его в тайне.Чтобы сгенерировать каждый токен, сделайте следующее:

  1. Создайте серийный номер, произвольно или последовательно - все, что важно, это то, что он уникален.-SHA1) серийного номера с секретным ключом.Это даст вам хеш-значение (160 бит в случае HMAC-SHA1).
  2. Объедините серийный номер с частью хеш-значения.Это код вашего купона.Количество битов хэш-значения, которое вы используете, определяет, насколько сложно создать правильный код с помощью грубой силы - использование n битов означает, что злоумышленникам придется попробовать (в среднем) 2 ^ (n-1) кодов, чтобы найтидействительныйКакие биты вы используете из хеша, не имеет значения.

Чтобы проверить код:

  1. Убедитесь, что серийный номер еще не находится в вашей базе данных, как выкуплено ранее.
  2. Вычислите HMAC для серийного номера, как описано выше.
  3. Сравните соответствующие биты HMAC с остальными частями кода.
  4. Добавьте серийный номер к вашемубаза данных, чтобы зарегистрировать его как используется.
1 голос
/ 11 мая 2011

Стандартный метод состоит в использовании одностороннего хеша для соли и числа для создания большого случайного числа.Затем используйте этот хеш для генерации вашего загадочного кода.Существует множество стандартных односторонних хэшей, которые вы можете использовать.MD5 - это обычное явление.

Чтобы упростить вам жизнь, я бы вмонтировал число в код некоторым простым способом.Например, prefix-2_-3_ -4_ -3 ___ будет иметь код 2343, а затем вы будете заполнять пробелы, используя данные из MD5 «число соли префикса».Это может быть так же просто, как сказать, что у вас есть алфавит чисел и символов, которые вы готовы использовать с n вещами в нем.Возьмите мод MD5 n, чтобы выбрать своего первого персонажа.Разделите MD5 на n.Затем повторяйте, пока у вас не появятся ваши персонажи.Чтобы проверить его, возьмите префикс, найдите соль, извлеките число, вычислите MD5 и выполните ту же процедуру для генерации других символов, которые должны быть в коде.

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