Do не магазин простой SHA-1 из номера кредитной карты, это будет путь к легко взломать (тем более, что последние 4 цифры известны). У нас была такая же проблема в моей компании: вот как мы ее решили.
Первое решение
- Для каждой кредитной карты, мы сохраняем последние 4 цифры, даты истечения срока, длинная случайная соль (50 байт длиной), и соленый хэш числа CC. Мы используем алгоритм хэширования bcrypt, поскольку он очень безопасен и может быть настроен как интенсивный, как вам хотелось бы, процессор. Мы настроили его на очень дорогой (около 1 секунды за хэш на нашем сервере!). Но я думаю, вы могли бы использовать SHA-256 вместо этого и повторять столько раз, сколько необходимо.
- Когда вводится новый номер CC, мы начинаем с поиска всех существующих номеров CC, которые заканчиваются на те же 4 цифры и имеют одинаковую дату истечения срока действия. Затем для каждого совпадающего CC мы проверяем, совпадает ли его сохраненный соленый хеш соленый хэш, рассчитанный по его соли, и номер нового CC. Другими словами, мы проверяем, есть или нет
hash(stored_CC1_salt+CC2)==stored_CC1_hash
.
Поскольку в нашей базе данных имеется около 100 тыс. Кредитных карт, нам нужно рассчитать около 10 хэшей, поэтому мы получим результат примерно через 10 секунд. В нашем случае это нормально, но вы можете немного настроить bcrypt. К сожалению, если вы это сделаете, это решение будет менее безопасным. С другой стороны, если вы настроите bcrypt на более интенсивный процессор, потребуется больше времени для сопоставления номеров CC.
Хотя я считаю, что это решение способа лучше, чем просто хранить в несоленый хэш числа CC, это не помешает очень мотивированному пирату (который удается получить копию базы данных), чтобы сломать один кредит в среднем в среднем от 2 до 5 лет. Так что если у вас есть 100k кредитных карт в вашей базе данных, и если у пирата есть лот процессора, то он может восстановить несколько номеров кредитных карт каждый день!
Это приводит меня к убеждению, что вы не должны сами вычислять хеш: вы должны делегировать это кому-то другому. Это второе решение (мы переходим к этому второму решению).
Второе решение
Просто ваш провайдер платежных генерировать псевдоним для вашей кредитной карты.
- для каждой кредитной карты, вы просто хранить все, что вы хотите сохранить (например, последние 4 цифры & дата окончания срока действия) плюс номер кредитной карты псевдоним.
- , когда введен новый номер кредитной карты, вы связываетесь со своим поставщиком платежей и передаете ему номер CC (или перенаправляете клиента поставщику платежей, и он вводит номер CC непосредственно на веб-сайте поставщика платежей). Взамен вы получаете псевдоним кредитной карты! Вот и все. Конечно, вы должны убедиться, что поставщик платежей предлагает эту опцию и что сгенерированный псевдоним фактически защищен (например, убедитесь, что они не просто вычисляют SHA-1 на номер кредитной карты!). Теперь пират должен разорвать вашу систему плюс в системе вашего поставщика платежей, если он хочет восстановить номера кредитных карт.
Это просто, быстро, безопасно (ну, по крайней мере, если ваш поставщик платежей). Единственная проблема, которую я вижу, заключается в том, что она связывает вас с поставщиком платежей.
Надеюсь, это поможет.
Согласен. Имейте в виду, что это делает регистрацию кредитной карты операцией O (n), где n - это существующее количество зарегистрированных карт. Плюс хеширование - довольно дорогостоящая операция. – Johan 2008-09-19 16:03:40