Очень удобно хранить соленый хэш номера кредитной карты, а не самого номера для безопасного поиска. Для 99% сценариев там будет достаточная кредитная карта для хранения - быстрая и безопасная.
Если вам действительно нужно обратимого шифрования кредитной карты для некоторых сценариев (продолжение счетов, к примеру), я бы с симметричным ключом хранится в безопасном месте другие чем базы данных. Прошло некоторое время с тех пор, как я просмотрел спецификации PCI, но я уверен, что это PCI-совместимый.
Если вам нужны быстрые поисковые запросы вместе с обратимым шифрованием, используйте обе опции: хэш и шифрование.
Редактировать: Кажется, есть некоторые споры по моему ответу. Я хотел бы отметить следующее очень интересное эссе от Integrity.com (PDF):
Hashing Credit Card Numbers: Unsafe Application Practices
Он подробно многие из вопросов, связанных с хранением хэш данных кредитных карт, но его вывод подтверждает мое предложение ,
Да, исходный хэш карты небезопасен; поэтому мы соединим наши хеши! Но статическая соль также небезопасна, они позволяют создавать радужные столы для известных статических солей. Поэтому лучше всего изменить наши соки, что непредсказуемо. В случае паролей достаточно использовать отдельный случайный хеш для каждого проверяемого пароля; он может даже находиться в той же таблице/строке, что и хешированный пароль. Для кредитных карт это должно быть одинаковым - случайная соль для каждого экземпляра хешируемой кредитной карты. Если номер кредитной карты хранится за транзакцию, для каждой транзакции используется отдельная соль.
Есть плюсы и минусы этого подхода, но он достаточно безопасен. Плюсы - отсутствие ключевого руководства; соль и хэш находятся там, и их не нужно менять, сохраняя при этом проверку проверки хэша; например делает ли этот хэш кредитной карты этим известным номером кредитной карты?
Противники находятся в поиске; невозможно эффективно искать определенный номер кредитной карты во многих транзакциях.
Конечно, у вас будет эта проблема с внешним шифрованием; если сама база данных не зашифрована (что-то поддерживает только некоторые базы данных), вы не сможете очень хорошо искать. Даже тогда шифрование в базе данных или даже на уровне таблицы значительно снижает эффективность поиска.
Вместо того, чтобы просить, мы заплатили им за это, чтобы сделать это для нас :) –
+1 Но я * делаю * нахожу этот вопрос очень интересным, поскольку я попросил его сам себе пару лет назад! –
Я только что прочитал. Это звучало как заговорщительный шепот. «Эй, ребята, кто-то хранит данные кредитной карты ... ssshhhh ... как они это делают?» –