Domanda

La rete System.Security.Cryptography namespace ha una raccolta piuttosto sconcertante di algoritmi che potrei utilizzare per crittografare i dettagli della carta di credito.Qual'è il migliore?

Chiaramente deve essere sicuro per una stringa relativamente corta.

MODIFICARE:Mi trovo nel Regno Unito, dove mi risulta che sia consentito archiviare i dettagli della carta di credito crittografati a condizione che il numero CVV a tre cifre non venga mai archiviato.E grazie a tutti per le ottime risposte.

È stato utile?

Soluzione

Senza offesa, ma la domanda è un po' "fuorviante".Non esiste una soluzione “proiettile d’argento”.Consiglierei di documentarsi sulla crittografia in generale e poi di eseguire un po' di modellazione delle minacce.Alcune domande (non è affatto un elenco completo) che dovresti porti:

  • Il modulo che esegue la crittografia è quello che deve decrittografarlo (in questo caso utilizzare la crittografia simmetrica) o invierà i dati a un altro modulo (su un'altra macchina) che lo utilizzerà (nel qual caso dovresti considerare la chiave pubblica criptovaluta)
  • Da cosa vuoi proteggerti?Qualcuno che accede al database ma non dispone del codice sorgente (nel qual caso è possibile codificare la chiave di crittografia direttamente nel codice sorgente)?Qualcuno che sniffa la tua rete locale (dovresti considerare soluzioni trasparenti come IPSec)?Qualcuno ruba il tuo server (può succedere anche nei data center, nel qual caso dovresti prendere in considerazione la crittografia completa del disco)?
  • È davvero necessario conservare i dati?Non puoi passarlo direttamente all'elaboratore della carta di credito e cancellarlo dopo aver ricevuto la conferma?Non puoi memorizzarlo localmente sul client in un cookie o Flash LSO?Se lo memorizzi sul client, assicurati di crittografarlo sul lato server prima di inserirlo in un cookie.Inoltre, se utilizzi i cookie, assicurati di renderli solo http.
  • È sufficiente confrontare l'uguaglianza dei dati (cioè i dati che mi ha fornito il cliente sono gli stessi dati che ho io)?In tal caso, considera la possibilità di memorizzarne un hash.Poiché i numeri delle carte di credito sono relativamente brevi e utilizzano un set ridotto di simboli, è necessario generare un sale univoco per ciascuno prima dell'hashing.

Modifica successiva:si noti che gli algoritmi di crittografia standard della stessa categoria (ad esempio 3DES e AES, entrambi cifrari a blocchi simmetrici) hanno una forza comparabile.La maggior parte dei sistemi (commerciali) non vengono danneggiati perché qualcuno ha forzato la loro crittografia, ma perché la loro modellazione delle minacce non era sufficientemente dettagliata (o addirittura non ne avevano alcuna).Ad esempio, puoi crittografare tutti i dati, ma se ti capita di avere un'interfaccia web pubblica che è vulnerabile all'iniezione SQL, non ti aiuterà molto.

Altri suggerimenti

Non importa.

I numeri completi delle carte non dovrebbero mai toccare il disco.

Tutto ciò che conta è il codice di autenticazione.

Per tracce ecc. utilizzerai solo le ultime 4 cifre xxxx xxxx xxxx 1234 e la data di scadenza.

Se si devono memorizzare i numeri delle carte, la scelta della crittografia sarà affidata alla banca acquirente.

A meno che tu non sia l'acquirente, nel qual caso dovrebbe esserci un vecchio programmatore Unix/db2 a cui dovresti chiedere.

"Non puoi memorizzarlo localmente presso il client in un cookie" <- MAI

Aggiungerei che semplicemente non dovresti memorizzarli a meno che tu non abbia davvero una buona ragione per farlo, e memorizzarli in un cookie è un Veramente cattiva idea: sono solo troppo facile di cui impossessarsi (cosa succede se qualcuno ruba un cookie, non importa quanto sia crittografato).

Se è necessario effettuare pagamenti ripetuti, la maggior parte dei fornitori di CC offrirà un modo per farlo memorizzando una sorta di token dal pagamento iniziale, senza conservare affatto il numero della carta (potresti semplicemente conservare le ultime 4 cifre da mostrare al cliente in modo che sappiano quale carta è memorizzata).

Davvero, non farlo!

Inoltre non dovresti mai e poi mai conservare il codice CCV.

Come da PCIDSS norme di conformità, è sufficiente qualsiasi standard di crittografia leader del settore.Quindi un 3DES con una chiave a 256 bit è abbastanza buono (anche se è possibile utilizzare altri standard).Controllalo http://pcianswers.com/2006/08/09/methods-of-encrypting-data/

Non dimenticare l'integrità qui.Esistono attacchi di falsificazione contro criptovalute pronte all'uso quando l'aggressore non conosce la chiave, ma può manipolare il testo cifrato.Questi possono essere particolarmente pericolosi quando:

  • crittografare stringhe brevi,
  • con sottostringhe note

Questo è esattamente il caso delle carte di credito.Pertanto, utilizzare System.Security.Cryptography AES o 3DES in modalità CBC senza eseguire il rollover del proprio checksum può essere pericoloso.Leggere:c'è qualche possibilità che un utente malintenzionato senza la chiave segreta possa sostituire un numero di carta di credito con un altro.

Se utilizzi un gateway di pagamento di terze parti, non è necessario memorizzare i numeri.

Non ha senso.

3des è abbastanza buono, conserva il sale accanto e conserva una chiave standard da qualche parte non nel database o in un file di configurazione.In questo modo, se vieni punito, non potranno decriptarlo.

C'è anche l'aspetto legale da considerare.Non conosco la situazione altrove, ma in Germania semplicemente non è consentito memorizzare i numeri delle carte di credito1). Periodo. Non importa se li crittografi o meno e in quale formato li memorizzi.

Tutto quello che Maggio fare (e qui mi riferisco a memoria, senza alcuna conoscenza giudiziaria) è memorizzare un hash forte (SHA-256?) del numero della carta di credito, insieme alle ultime quattro cifre e al numero del conto.E sì, è banale ricostruire il numero completo solo da queste informazioni.Le leggi non sono sempre logiche.


1) Tranne se sei un istituto di carte di credito certificato a livello federale.

Suggerimento: Dovresti verificare se è legale memorizzare i numeri delle carte di credito.In Svezia ad esempio dovrai essere certificato da PCI (industria delle carte di pagamento), dove verrà messa alla prova la tua sicurezza interna ed esterna (e molte altre cose).

Dovresti pensarci una o due volte prima di memorizzare i dati della carta di credito, poiché i costi legali derivanti da un errore potrebbero essere costosi.

Crittografare la carta di credito con una chiave pubblica.Fornisci la chiave privata solo alla macchina che elabora i pagamenti.La macchina che elabora il pagamento può quindi interrogare il database ed eseguire il lavoro, e nessun altro, nemmeno la macchina che ha aggiunto la voce, sarà in grado di decrittografarla.

Qualcosa come openssl_seal di PHP, anche se se vuoi forse con un algoritmo diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top