Question

Le net System.Security.Cryptography l'espace de noms possède une collection plutôt déroutante d'algorithmes que je pourrais utiliser pour le cryptage des détails des cartes de crédit.Quel est le meilleur ?

Il doit clairement être sécurisé pour une chaîne relativement courte.

MODIFIER:Je suis au Royaume-Uni, où je comprends que nous sommes d'accord pour stocker les détails cryptés des cartes de crédit tant que le numéro CVV à trois chiffres n'est jamais stocké.Et merci à tous pour les excellentes réponses.

Était-ce utile?

La solution

Ne vous offensez pas, mais la question est un peu "malavisée".Il n’existe pas de solution miracle.Je recommanderais de se renseigner sur la cryptographie en général, puis de modéliser les menaces.Quelques questions (en aucun cas une liste exhaustive) que vous devriez vous poser :

  • Le module effectuant le chiffrement est-il celui qui doit le déchiffrer (dans ce cas, utilisez un chiffrement symétrique) ou enverra-t-il des données à un autre module (sur une autre machine) qui l'utilisera (auquel cas vous devriez considérer la clé publique crypto-monnaie)
  • Contre quoi voulez-vous vous protéger ?Quelqu'un accédant à la base de données mais n'ayant pas le code source (auquel cas vous pouvez coder en dur la clé de cryptage directement dans la source) ?Quelqu'un renifle votre réseau local (vous devriez envisager des solutions transparentes comme IPSec) ?Quelqu'un vole votre serveur (cela peut arriver même dans les centres de données - auquel cas le chiffrement complet du disque doit être envisagé) ?
  • Avez-vous vraiment besoin de conserver les données ?Ne pouvez-vous pas le transmettre directement au processeur de la carte de crédit et l'effacer après avoir reçu la confirmation ?Ne pouvez-vous pas le stocker localement chez le client dans un cookie ou Flash LSO ?Si vous le stockez chez le client, assurez-vous de le chiffrer côté serveur avant de le placer dans un cookie.De plus, si vous utilisez des cookies, assurez-vous de les utiliser uniquement en http.
  • Est-il suffisant de comparer l'égalité des données (c'est-à-dire que les données que le client m'a fournies sont les mêmes que moi) ?Si tel est le cas, envisagez d’en stocker un hachage.Étant donné que les numéros de carte de crédit sont relativement courts et utilisent un ensemble réduit de symboles, un sel unique doit être généré pour chacun avant le hachage.

Modifier plus tard:notez que les algorithmes de chiffrement standard de la même catégorie (par exemple 3DES et AES - tous deux étant des chiffrements par blocs symétriques) sont de force comparable.La plupart des systèmes (commerciaux) ne sont pas en panne parce que quelqu'un a forcé leur cryptage, mais parce que leur modélisation des menaces n'était pas suffisamment détaillée (ou carrément, ils n'en avaient pas).Par exemple, vous pouvez chiffrer toutes les données, mais si vous disposez d'une interface Web publique vulnérable à l'injection SQL, cela ne vous aidera pas beaucoup.

Autres conseils

Ce n'est pas grave.

Les numéros de carte complets ne doivent jamais toucher le disque.

Tout ce qui compte, c'est le code d'authentification.

Pour les traces, etc., vous n'utiliserez que les 4 derniers chiffres xxxx xxxx xxxx 1234 et la date d'expiration.

Si vous devez stocker des numéros de carte, le choix de cryptographie sera mandaté par la banque acquéreuse.

Sauf si vous êtes l'acquéreur, auquel cas vous devriez demander à un vieux programmeur Unix/db2.

"Ne pouvez-vous pas le stocker localement chez le client dans un cookie" <-- JAMAIS

J'ajouterais que vous ne devriez tout simplement pas les stocker à moins d'avoir une très bonne raison de le faire, et les stocker dans un cookie est une bonne chose. vraiment mauvaise idée - ils sont juste trop facile pour mettre la main sur (que se passe-t-il si quelqu'un vole un cookie - peu importe à quel point il est crypté).

Si vous devez effectuer des paiements répétés, la plupart des fournisseurs CC proposent un moyen de le faire en stockant une sorte de jeton du paiement initial, sans conserver du tout le numéro de carte (vous pouvez simplement conserver les 4 derniers chiffres à afficher au client). afin qu'ils sachent quelle carte est stockée).

Vraiment, ne le fais pas !

De plus, vous ne devez jamais conserver le code CCV.

Selon PCI DSS règles de conformité, n’importe quelle norme de cryptage leader du secteur suffit.Donc un 3DES avec une clé de 256 bits est suffisant (bien que d'autres standards puissent être utilisés).Regarde ça http://pcianswers.com/2006/08/09/methods-of-encrypting-data/

N'oubliez pas l'intégrité ici.Il existe des attaques de contrefaçon contre les cryptomonnaies prêtes à l'emploi lorsque l'attaquant ne connaît pas la clé, mais peut manipuler le texte chiffré.Ceux-ci peuvent être particulièrement désagréables lorsque :

  • chiffrer des chaînes courtes,
  • avec des sous-chaînes connues

C'est exactement le cas des cartes de crédit.Ainsi, utiliser System.Security.Cryptography AES ou 3DES en mode CBC sans générer votre propre somme de contrôle peut être dangereux.Lire:il est possible qu'un attaquant ne disposant pas de la clé secrète puisse remplacer un numéro de carte de crédit par un autre.

Si vous utilisez une passerelle de paiement tierce, vous n'avez pas besoin de stocker les numéros.

Il n'y a aucun intérêt.

3des est plutôt bon, stockez le sel à côté et conservez une clé standard quelque part pas dans la base de données ou dans un fichier de configuration.De cette façon, si vous êtes pwned, ils ne peuvent pas le déchiffrer.

Il y a aussi l’aspect juridique à considérer.Je ne connais pas la situation ailleurs, mais en Allemagne, vous n'êtes tout simplement pas autorisé à stocker des numéros de carte de crédit1). Période. Peu importe que vous les cryptiez ou non et dans quel format vous les stockez.

Vous tous peut faire (et ici je fais référence de mémoire, sans aucune connaissance judiciaire) consiste à stocker un hachage fort (SHA-256 ?) du numéro de carte de crédit, ainsi que les quatre derniers chiffres et le numéro de compte.Et oui, il est trivial de reconstruire le numéro complet à partir de ces seules informations.Les lois ne sont pas toujours logiques.


1) Sauf si vous êtes un institut de cartes de crédit certifié par le gouvernement fédéral.

Indice: Vous devriez vérifier s'il est légal de stocker des numéros de carte de crédit.En Suède par exemple, vous devrez être certifié par PCI (industrie des cartes de paiement), où votre sécurité interne et externe sera testée (longtemps avec plein d'autres choses).

Vous devriez réfléchir une ou deux fois avant de stocker des informations de carte de crédit, car les frais juridiques en cas de mauvaise manipulation pourraient être coûteux.

Chiffrez la carte de crédit avec une clé publique.Donnez la clé privée au processeur de paiement uniquement.La machine chargée du traitement des paiements peut alors interroger la base de données et effectuer le travail, et personne d'autre, même la machine qui a ajouté l'entrée, ne pourra la déchiffrer.

Quelque chose comme openssl_seal de PHP, mais si vous le souhaitez, peut-être avec un algorithme différent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top