Il est assez facile de stocker un hachage salé d'un numéro de carte de crédit plutôt que le numéro lui-même pour des recherches sécurisées. Pour 99 % des scénarios existants, cette carte de crédit suffirait pour le stockage - rapide et très sûr.
Si vous avez vraiment besoin réversible pour certains scénarios (facturation continue, par exemple), j'opterais pour une clé symétrique stockée dans un endroit sûr. autres que la base de données. Cela fait un moment que je n'ai pas consulté les spécifications PCI, mais je suis presque certain que c'est conforme aux normes PCI.
Si vous avez besoin de recherches rapides et d'un cryptage réversible, utilisez les deux options : un hachage et un cryptage.
Editer : Ma réponse semble susciter une certaine controverse. Je voudrais attirer l'attention sur l'essai très intéressant suivant d'Integrity.com (PDF) :
Hacher les numéros de cartes de crédit : Pratiques d'application dangereuses
Il détaille de nombreux problèmes liés au stockage d'un hachage de données de cartes de crédit, mais sa conclusion confirme ma suggestion.
Oui, un hachage brut de la carte n'est pas sûr ; c'est pourquoi nous salons nos hachages ! Mais un sel statique n'est pas non plus sûr, ils permettent la création de tables arc-en-ciel pour des sels statiques connus. Il est donc préférable de faire varier nos sels de manière imprévisible. Dans le cas des mots de passe, il suffit d'utiliser un hachage aléatoire distinct pour chaque mot de passe vérifié ; il peut même résider dans la même table/rangée que le mot de passe haché. Dans le cas des cartes de crédit, il doit en être de même : un sel aléatoire pour chaque instance de la carte de crédit en cours de hachage. Si le numéro de la carte de crédit est stocké par transaction, il faut un sel distinct pour chaque transaction.
Cette approche présente des avantages et des inconvénients, mais elle est suffisamment sûre. Les avantages sont l'absence de gestion des clés ; le sel et le hachage sont là et n'ont pas besoin d'être modifiés, tout en permettant des contrôles d'audit du hachage ; par exemple, le hachage de cette carte de crédit correspond-il à ce numéro de carte de crédit connu ?
Les inconvénients se situent au niveau de la recherche ; il n'est pas possible de rechercher efficacement un numéro de carte de crédit particulier dans de nombreuses transactions.
Bien entendu, ce problème se pose de toute façon avec le cryptage externe ; à moins que la base de données ne soit elle-même cryptée (ce que seules certaines bases de données prennent en charge), vous ne pourrez pas effectuer une recherche très efficace. Même dans ce cas, le cryptage au niveau de la base de données ou même de la table réduit considérablement l'efficacité de la recherche.