Предотвратить несколько покупок с помощью одной и той же кредитной карты? - PullRequest
1 голос
/ 04 февраля 2012

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

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

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

Итак, я вернулся к чертежной доске и ищу новые идеи. Кто-нибудь знает хороший подход к этой проблеме, сохраняя при этом PCI-совместимость, насколько я могу?

Я работаю с Rails 3 и использую ActiveMerchant для интеграции с моим платежным шлюзом Authorize.net, если это вообще помогает.

Ответы [ 5 ]

1 голос
/ 04 февраля 2012

подделка вашего истинного номера кредитной карты онлайн - лучший способ предотвратить это. Клиенты Ситибанка могут войти в систему и использовать этот инструмент со всеми учетными записями. Просто сгенерируйте число и дату истечения срока действия для использования в Интернете, и пока все в порядке.

1 голос
/ 04 февраля 2012

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

Соль

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

Выберите хороший алгоритм

Хотя MD5 теперь печально известен и реализован на всех языках, он также настолько распространен, что вы можете найти готовые радужные таблицы.Также очень быстро генерировать хеш.Ваша система, вероятно, может выдержать небольшую задержку и использовать намного более интенсивный хэш-процессор.Это делает стоимость создания радужного стола намного дороже.Взять, к примеру, алгоритм Tiger .

Хеширование более одного раза

Если у вас есть несколько связанных точек данных, будет создано несколько хешейэто намного сложнее сделать атаку радуги.Например: Hash (Hash (Card # + salt1) + expireDate + salt2) - требует знания как номера карты, так и даты создания (легко для вас), но не может быть легко переработано (для каждой карты требуется радуга# * каждый полезный срок годности + знание обеих солей).

Редактировать: (ваши комментарии)

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

Динамическая соль добавление случайного значения в хеш отлично подходит для уменьшения радужных атак - вы сохраняете это случайное значениефигура в таблице с хэшированным значением - теперь, когда вы строите радугу, вы должны построить ее для каждой динамической соли.Однако для ваших нужд вы не можете этого сделать - вам нужно знать правильную случайную соль для использования во второй раз, когда вы создаете хеш (иначе вы никогда не получите перехват при использовании второй карты) ... чтобы это былопредсказуемый / повторяемый, вам нужно будет основывать динамическую соль на некоторой части числа ... что фактически делает многократное хеширование с другой точкой данных.Чем больше у вас точек данных, тем больше вы можете хешировать в этом направлении - например, если у вас есть CVV (3 хеша) или, возможно, вы хешируете 8 цифр за раз (всего 3 хеша: hash(hash(hash(1..8+salt1)+9..16+salt2)+expDate+salt3)).

Best Hash это движущаяся цель, но есть хорошее обсуждение security.stackexchange .Что указывает на SHA-512.

0 голосов
/ 04 февраля 2012

Я думаю, что вы смотрите в неправильном направлении. Я бы просто проверил последние 4 карты, ip и адреса доставки. Риск сохранения этих данных в сравнении с ущербом, если небольшое количество пользователей играло в последние 4 & ip-решения, того не стоит. (Он говорит, что не знает природу покупок.)

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

0 голосов
/ 04 февраля 2012

пользователь может зарегистрировать несколько учетных записей.

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

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

0 голосов
/ 04 февраля 2012

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

...