Sicurezza del proxy decifrante asimmetrico

2

Sto pensando al modo più sicuro per archiviare dati sicuri (ad esempio numeri di carta di credito) con l'obbligo di inviarli in testo chiaro a API di terze parti (quindi l'hashing non entra in gioco).

Sono arrivato a una soluzione che sembra essere più sicura rispetto a quella tipica "memorizzali crittografati e decifrati quando devi utilizzarli utilizzando la stessa chiave".

L'idea è di crittografarlo e archiviarlo sul server dell'applicazione direttamente dopo averlo acquisito dall'utente con una chiave pubblica.

La chiave privata non verrebbe memorizzata sul server delle applicazioni. Invece il server delle applicazioni invierà il messaggio all'API di terze parti utilizzando i valori crittografati.

La seconda parte della soluzione sarebbe un proxy HTTP su un server separato che indirizza i messaggi all'API di terze parti e decrittografa i valori crittografati. La chiave privata verrebbe memorizzata solo sul proxy e non verrebbe memorizzata su disco (solo nella RAM - ogni riavvio richiederebbe l'inserimento della chiave privata).

Sembra che usare il proxy come una scatola nera che non avrebbe bisogno di cambiare nonostante lo sviluppo dell'applicazione aiuterebbe a proteggerlo meglio del server delle applicazioni (a cui più persone devono avere accesso). Inoltre, a causa della necessità di non memorizzare la chiave privata sul disco, non sarebbe un problema inserire la chiave dopo ogni riavvio del server proxy poiché non dovrebbe essere riavviata frequentemente come una macchina server delle applicazioni .

Qualche idea su vantaggi e svantaggi di tale soluzione? Ci sono delle applicazioni che potrebbero aiutarmi a raggiungerlo (proxy con capacità di usare codice di trasformazione personalizzato, metodo di memorizzazione sicura dei valori nella RAM)?

    
posta deadbeef 05.06.2012 - 16:11
fonte

2 risposte

1

Citando il Karate Kid, "Ricorda, il miglior blocco non è lì". (Grazie a Bill Cheswick per questa citazione.) In altre parole, il modo più sicuro per archiviare una carta di credito in modo sicuro è ... (aspettalo ...) non memorizzarlo affatto. Utilizzare un processore di carta di credito di terze parti che memorizza i numeri delle carte di credito per voi, quindi non è necessario. Potrebbero darti un handle che puoi usare invece.

In alternativa, puoi creare il tuo servizio. Crea un semplice proxy che memorizza il numero della carta di credito in modo sicuro, nel proprio database, crittografato, utilizzando una chiave di crittografia che non è nota al resto del codice. Il proxy può fornire un'API. Quando un utente registra il proprio account, si invia il proprio numero di carta di credito al proxy per l'archiviazione. Quando un utente effettua un pagamento, invia un messaggio al proxy: "addebita $ 27 alla carta di credito dell'utente xyz" e il proxy è responsabile del recupero del numero di carta di credito e dell'avvio della transazione con il processore della carta di credito. Indurire il servizio utilizzato per memorizzare i numeri delle carte di credito e prendere in considerazione l'avvio di alcune procedure di limitazione della velocità o di verifica. In questo modo, se il resto del codice viene compromesso, almeno gli autori dell'attacco non possono rubare tutti i numeri di carta di credito degli utenti.

Vedi anche Come posso creare un servizio che si collega automaticamente a un servizio di terze parti senza memorizzare le credenziali in testo semplice? [che chiede di memorizzare una password in modo sicuro, ma è possibile applicare le stesse tecniche per memorizzare un numero di carta di credito], Memorizzazione dei numeri di carta di credito e Memorizzazione delle carte di credito per i pagamenti automatici? .

    
risposta data 06.06.2012 - 06:20
fonte
0

Un approccio migliore potrebbe essere l'utilizzo di un dispositivo HSM per la crittografia dei dati della carta di credito dell'utente in un database separato. Molti HSM forniscono funzionalità di crittografia a livello di colonna di base di dati, dove lo sviluppo di moduli sicuri si adatta a livelli molto elevati. Non avrai bisogno di avere chiavi asimmetriche, invece l'HSM può generare chiavi simmetriche per ciascun utente e quelle chiavi saranno salvaguardate dal mondo della sicurezza dell'HSM. Oltre a ciò, per avere una sicurezza di alto livello è possibile proteggere i dati cifrati usando la frase di sfida che viene creata dall'utente finale (il titolare della carta). Il tunneling SSL può essere eseguito direttamente tramite HSM per la convalida della sfida. In questo modo l'infrastruttura non conoscerà i dettagli della sfida e della carta utente.

    
risposta data 06.06.2012 - 08:23
fonte

Leggi altre domande sui tag