Существует ли лучший .NET-алгоритм для шифрования кредитных карт?

StackOverflow https://stackoverflow.com/questions/41220

Вопрос

В .NET System.Security.Cryptography namespace содержит довольно сбивающий с толку набор алгоритмов, которые я мог бы использовать для шифрования данных кредитной карты.Какой из них самый лучший?

Очевидно, что он должен быть надежно закреплен на относительно короткой струне.

Редактировать:Я нахожусь в Великобритании, где, как я понимаю, мы можем хранить зашифрованные данные кредитной карты до тех пор, пока трехзначный номер CVV никогда не сохраняется.И спасибо всем за отличные отзывы.

Это было полезно?

Решение

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

  • Является ли модуль, выполняющий шифрование, тем, которому необходимо его расшифровать (в данном случае используйте симметричную криптографию), или он отправит данные в другой модуль (на другой машине), который будет их использовать (в этом случае вам следует рассмотреть криптографию с открытым ключом)
  • От чего вы хотите защититься?Кто-то обращается к базе данных, но у него нет исходного кода (в этом случае вы можете жестко ввести ключ шифрования непосредственно в исходный код)?Кто-то прослушивает вашу локальную сеть (вам следует рассмотреть прозрачные решения, такие как IPSec)?Кто-то крадет ваш сервер (это может произойти даже в центрах обработки данных - в этом случае следует рассмотреть возможность полного шифрования диска)?
  • Вам действительно нужно хранить эти данные?Разве вы не можете напрямую передать его оператору обработки кредитных карт и стереть после получения подтверждения?Разве вы не можете сохранить его локально на клиенте в виде файла cookie или Flash LSO?Если вы храните его на клиенте, убедитесь, что вы зашифровали его на стороне сервера, прежде чем помещать в файл cookie.Кроме того, если вы используете файлы cookie, убедитесь, что вы используете их только по протоколу http.
  • Достаточно ли сравнить равенство данных (т. е. данные, которые предоставил мне клиент, совпадают с теми, что есть у меня)?Если это так, подумайте о том, чтобы сохранить его хэш.Поскольку номера кредитных карт относительно короткие и используют сокращенный набор символов, перед хэшированием для каждой из них должна быть сгенерирована уникальная соль.

Последующее редактирование:обратите внимание, что стандартные алгоритмы шифрования из той же категории (например, 3DES и AES - оба являются симметричными блочными шифрами) обладают сопоставимой надежностью.Большинство (коммерческих) систем ломаются не потому, что кто-то грубо применил их шифрование, а потому, что их моделирование угроз не было достаточно подробным (или у них вообще его не было).Например, вы можете зашифровать все данные, но если у вас есть общедоступный веб-интерфейс, который уязвим для внедрения SQL, это вам мало поможет.

Другие советы

Это не имеет значения.

Полные номера карт никогда не должны касаться диска.

Все, что имеет значение, это код авторизации.

Для отслеживания и т. д. вы будете использовать только последние 4 цифры xxxx xxxx xxxx 1234 и дату истечения срока действия.

Если вы хотите хранить номера карт, выбор криптографии будет осуществляться банком-эквайером.

Если вы не приобретатель, в этом случае вам следует спросить старого программиста Unix / db2.

" вы не можете хранить его локально на клиенте в файле cookie " < - НИКОГДА

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

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

Действительно, просто не делай этого!

Кроме того, вы никогда не должны хранить код CCV.

Согласно правилам PCI DSS , достаточно любого ведущего отраслевого стандарта шифрования. Таким образом, 3DES с 256-битным ключом достаточно хорош (хотя могут использоваться и другие стандарты). Проверьте это http://pcianswers.com/2006/08/ 09 / методы-Of-шифрование-данных /

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

  • шифрование коротких строк,
  • с известными подстроками

Именно так обстоит дело с кредитными картами.Итак, используя Систему.Безопасность.Криптография AES или 3DES в режиме CBC без изменения вашей собственной контрольной суммы может быть опасной.Читать:существует некоторая вероятность того, что злоумышленник, не имеющий секретного ключа, сможет заменить номер одной кредитной карты другим.

Если вы используете сторонний платежный шлюз, вам не нужно хранить номера.

Нет смысла.

3des довольно хорош, храните соль вдоль и храните стандартный ключ где-то не в базе данных или в файле конфигурации. Таким образом, если вы получили pwned, они не смогут расшифровать его.

Существует также правовой аспект, который необходимо учитывать. Я не знаю ситуацию в другом месте, но в Германии вам просто не разрешено хранить номера кредитных карт 1) . Период. Неважно, шифруете ли вы их или нет, и в каком формате вы их храните.

Все, что вы можете делать (и здесь я имею в виду по памяти, без каких-либо юридических знаний), это хранить сильный хэш (SHA-256?) номера кредитной карты вместе с последним четыре цифры и номер счета. И да, тривиально восстановить полное число только из этой информации. Законы не всегда логичны.

<Ч>

1) За исключением случаев, когда вы сертифицированы федеральным институтом кредитных карт.

Подсказка . Вам следует выяснить, разрешено ли хранить номера кредитных карт. Например, в Швеции вы должны быть сертифицированы PCI (индустрия платежных карт) , где ваши внутренние и внешние Безопасность будет проверена (долго со многими другими вещами).

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

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

Нечто подобное PHP openssl_seal, хотя, если вы хотите, возможно, с другим алгоритмом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top