49 votes

Stockage des données des cartes de crédit

J'ai un besoin commercial qui m'oblige à stocker les détails complets de la carte de crédit d'un client (numéro, nom, date d'expiration, CVV2) pendant une courte période.

Justification : Si un client appelle pour commander un produit et que sa carte de crédit est refusée sur le champ, vous risquez de perdre la vente. Si vous prenez ses coordonnées, le remerciez pour la transaction et constatez ensuite que la carte est refusée, vous pouvez le rappeler et il est plus probable qu'il trouve un autre moyen de payer le produit. Si la carte de crédit est acceptée, vous effacez les données de la commande.

Je ne peux pas changer cela. Le système existant stocke les détails de la carte de crédit en texte clair, et dans le nouveau système que je suis en train de construire pour le remplacer, je suis clairement pas Je vais reproduire cela !

Ma question est donc de savoir comment je peux stocker en toute sécurité une carte de crédit pour une courte période de temps. Je veux évidemment une sorte de cryptage, mais quel est le meilleur moyen de le faire ?

Environnement : C#, WinForms, SQL-Server.

50voto

bashmohandes Points 1930

Cependant, je suppose que vous utilisez un service tiers pour effectuer votre transaction, tel que PayPal/Verisign ou autre, la plupart d'entre eux ont des API qui vous permettent d'enregistrer les informations d'identification de la carte de crédit de leur côté, et ils vous renvoient une clé que vous pouvez ensuite utiliser pour compléter ou initier des transactions, ils s'occupent donc de la partie difficile, alors que tout ce que vous avez à faire est de stocker cette clé dans votre base de données.

14voto

Cade Roux Points 53870

Je ne crois pas qu'il soit réellement illégal de stocker des informations CVV (dans le sens où cela va à l'encontre de toute loi), mais cela enfreint les règles de l'industrie des cartes de paiement, qui peuvent imposer un certain nombre de sanctions différentes. Ainsi, vos exigences pourraient vous empêcher d'accepter les cartes de crédit ;-(

14voto

Flory Points 1911

Andrew, tu dois comprendre le PCI-DSS ce qui n'est pas une mince affaire. Personnellement, je trouve cela extrêmement vague mais voici ce que je comprends.

Tout d'abord, dans le scénario que vous décrivez, j'essaierais d'autoriser la carte pour le montant total et, en cas d'échec, j'enregistrerais les informations du client (mais pas les données du titulaire de la carte) afin que quelqu'un puisse contacter l'utilisateur. Là où je travaillais, certains de nos clients ne facturaient qu'un dollar et annulaient immédiatement la transaction, juste pour s'assurer que la carte était valide. Ils traitaient ensuite toutes les commandes manuellement.

C'est lors d'une autorisation réussie que vous devrez enregistrer le numéro. Le seul numéro dont vous avez alors besoin est le numéro de la carte de crédit et le code de transaction (du moins avec toutes les passerelles avec lesquelles j'ai travaillé).

La norme, la dernière fois que je l'ai consultée, n'était pas spécifique aux algorithmes de cryptage, mais indiquait clairement qu'il devait s'agir d'un cryptage inviolable.

Maintenant, une chose que vous ne pouvez pas faire est de stocker le CCV après l'autorisation. D'après ce que j'ai compris, vous pouvez le stocker avant l'autorisation, mais je n'ai jamais pu trouver quelqu'un qui le mette par écrit. En gros, si vous autorisez la carte, vous avez intérêt à l'effacer.

Et ce n'est pas illégal à ce stade, mais si vous vous faites coincer, ils vous mettront le couteau sous la gorge. Ils ont le pouvoir de vous infliger de lourdes amendes, mais il semble que ce qu'ils font généralement, c'est vous mettre en redressement. Si vous ne vous conformez pas, je ne sais pas ce qui se passe car toutes les personnes à qui j'ai entendu dire que cela arrivait se sont conformées. Mais ensuite, ils vous examinent vraiment au microscope.

En fin de compte, je crois que le seul moyen dont ils disposent vraiment est de vous empêcher d'accepter les cartes de crédit. La plupart des commerçants avec lesquels j'ai travaillé avaient une peur bleue de cela.

8voto

Joe Kuemerle Points 3866

Si vous stockez des informations relatives à des cartes de crédit, vous devez vraiment vous conformer aux normes PCI, sinon vous vous exposez à des problèmes.

Cela dit, regardez le cryptage au niveau de la cellule disponible dans SQL Server 2005 et plus. Par coïncidence :) J'ai récemment donné une présentation avec des exemples T-SQL sur le cryptage avec SQL Server 2005/2008 disponible ici : http://moss.bennettadelson.com/Lists/Events/Attachments/9/June2008.zip (Emplacement du lien mis à jour le 23 décembre 2008)

8voto

sallen Points 310

Si vous souhaitez simplement stocker la chaîne de caractères pendant une courte période de temps en mémoire, vous pouvez jeter un coup d'oeil à System.Security.SecureString .

Tiré de ce respuesta :

Les valeurs SecureString sont stockées sous forme cryptée (ou plutôt obscurcie), mais surtout, elles ne sont jamais transférées sur le disque et peuvent être éliminées immédiatement lorsque vous n'en avez plus besoin.

Ils sont délicats à utiliser car vous ne pouvez les construire qu'un caractère à la fois (pour vous encourager à les construire en capturant les frappes au moment où l'utilisateur tape son mot de passe), et nécessitent trois lignes de code pour récupérer puis effacer leur texte en clair, mais lorsqu'ils sont utilisés correctement, ils peuvent rendre un programme plus sûr en évitant la vulnérabilité de la mémoire virtuelle.

À la fin de l'exemple, la SecureString est convertie en une chaîne gérée ordinaire, ce qui la rend à nouveau vulnérable (veillez à utiliser le motif try-catch-finally pour remettre à zéro la chaîne après l'avoir utilisée). L'utilité de SecureString est de réduire la surface d'attaque en limitant le nombre de copies que le Garbage Collector fera de la valeur, et en réduisant la probabilité d'être écrite dans le fichier d'échange.

// Make a SecureString
SecureString sPassphrase = new SecureString();
Console.WriteLine("Please enter your passphrase");
ConsoleKeyInfo input = Console.ReadKey(true);
while (input.Key != ConsoleKey.Enter)
{
   sPassphrase.AppendChar(input.KeyChar);
   Console.Write('*');
   input = Console.ReadKey(true);
}
sPassphrase.MakeReadOnly();

// Recover plaintext from a SecureString
// Marshal is in the System.Runtime.InteropServices namespace
try {
   IntPtr ptrPassphrase = Marshal.SecureStringToBSTR(sPassphrase);
   string uPassphrase = Marshal.PtrToStringUni(ptrPassphrase);
   // ... use the string ...
}
catch {
   // error handling
} 
finally {
   Marshal.ZeroFreeBSTR(ptrPassphrase);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X