Довольно просто хранить соленый хеш номера кредитной карты, а не сам номер для безопасного поиска. Для 99% сценариев этого было бы достаточно кредитной карты для хранения - быстро и очень безопасно.
Если вам действительно необходимо обратимое шифрование кредитной карты для какого-либо сценария (например, продолжение биллинга), я бы использовал симметричный ключ, хранящийся в безопасном месте , отличный от база данных. Прошло много времени с тех пор, как я посмотрел спецификации PCI, но я уверен, что он совместим с PCI.
Если вам нужен быстрый поиск наряду с обратимым шифрованием, используйте оба варианта: хэш и шифрование.
Edit:
Кажется, есть некоторые разногласия по поводу моего ответа. Я хотел бы отметить следующее очень интересное эссе от Integrity.com (PDF):
Хэширование номеров кредитных карт: небезопасные способы применения
В нем подробно описываются многие проблемы, связанные с хранением хэша данных кредитной карты, но его заключение подтверждает мое предложение.
Да, необработанный хэш карты не защищен; вот почему мы солим наши хеш-коды! Но статическая соль также небезопасна, они позволяют создавать радужные таблицы для известных статических солей. Поэтому лучше, чтобы наши соли отличались непредсказуемым образом. В случае паролей достаточно использовать отдельный случайный хэш для каждого проверяемого пароля; он может даже находиться в той же таблице / строке, что и хешированный пароль. В случае с кредитными картами это должно быть одинаково - случайная соль для каждого экземпляра хешируемой кредитной карты. Если номер кредитной карты сохраняется для каждой транзакции, то для каждой транзакции используется отдельная соль.
Есть плюсы и минусы этого подхода, но он достаточно безопасен. Плюсы - отсутствие ключевого управления; соль и хэш находятся тут же, и их не нужно менять, хотя они позволяют проверять проверки хеша; например совпадает ли хэш этой кредитной карты с известным номером кредитной карты?
Минусы в поиске; невозможно эффективно найти определенный номер кредитной карты во многих транзакциях.
Конечно, у вас все равно будет эта проблема с внешним шифрованием; если база данных сама по себе не зашифрована (что-то, что поддерживают только некоторые базы данных), вы не сможете выполнять поиск очень хорошо. Даже в этом случае шифрование в базе данных или даже на уровне таблицы значительно снижает эффективность поиска.