Do not хранит простой SHA-1 номера кредитной карты, это будет way , который легко взломать (особенно, если известны последние 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 лет. Так что, если у вас есть 100 тыс. Кредитных карт в вашей базе данных, и если у пирата есть процессор лот , он может каждый день восстанавливать несколько номеров кредитных карт!
Это приводит меня к убеждению, что вам не следует вычислять хеш самостоятельно: вы должны делегировать это кому-то другому. Это второе решение (мы находимся в процессе перехода на это второе решение).
Второй раствор
Просто попросите поставщика платежных услуг создать псевдоним для вашей кредитной карты.
- для каждой кредитной карты вы просто сохраняете все, что хотите сохранить (например, последние 4 цифры и срок действия) плюс псевдоним номера кредитной карты.
- при вводе нового номера кредитной карты вы связываетесь с вашим платежным провайдером и даете ему номер CC (или вы перенаправляете клиента на провайдера платежей, и он вводит номер CC непосредственно на веб-сайте провайдера платежей). Взамен вы получите псевдоним кредитной карты! Вот и все. Конечно, вы должны убедиться, что ваш платежный провайдер предлагает эту опцию и что сгенерированный псевдоним действительно безопасен (например, убедитесь, что они не просто вычисляют SHA-1 по номеру кредитной карты!). Теперь пират должен сломать вашу систему плюс систему вашего провайдера платежей, если он хочет восстановить номера кредитных карт.
Это просто, это быстро, это безопасно (ну, по крайней мере, если ваш провайдер платежей). Единственная проблема, которую я вижу, это то, что она связывает вас с вашим платежным провайдером.
Надеюсь, это поможет.