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

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

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

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

Ответы [ 10 ]

23 голосов
/ 03 сентября 2008

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

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

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

12 голосов
/ 04 сентября 2008

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

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

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

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

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

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

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

7 голосов
/ 04 сентября 2008

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

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

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

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

4 голосов
/ 03 сентября 2008

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

1 голос
/ 06 сентября 2008

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

Нет смысла.

1 голос
/ 05 сентября 2008

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

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

Это в точности так и для кредитных карт. Поэтому использование System.Security.Cryptography AES или 3DES в режиме CBC без использования собственной контрольной суммы может быть опасным. Читайте: есть шанс, что злоумышленник без секретного ключа сможет заменить один номер кредитной карты другим.

0 голосов
/ 22 января 2011

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

Что-то вроде PHP openssl_seal, хотя, если вы хотите, возможно, с другим алгоритмом.

0 голосов
/ 04 сентября 2008

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

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

0 голосов
/ 04 сентября 2008

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

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


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

0 голосов
/ 03 сентября 2008

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

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