PHP e MySQL che crittografa i dati che ho bisogno di decodificare a un certo punto

3

Ho un'applicazione in cui un utente compra "spille per carte regalo". Una volta completato l'acquisto, noi, come broker, acquistiamo i pin da una terza parte e dobbiamo consegnarli all'utente finale.

Una volta che abbiamo i pin, dobbiamo caricarli affinché l'utente possa usarli come una normale scheda. A causa della necessità che si tratti di dati sensibili, ma allo stesso tempo di dati che devono essere mostrati all'utente finale, mi trovo in un approccio migliore qui.

Devo memorizzare questi codici in modo sicuro, ma allo stesso tempo, essere in grado di decodificarli in quanto l'utente finale deve vedere il codice per l'utente sul sito Web del commerciante XYZ.

L'applicazione utilizza il framework CodeIgniter di PHP che ha una libreria di crittografia incorporata.

Esempio:

$this->encryption->encrypt($data['Pin']) .

Il pin viene quindi crittografato e memorizzato nel DB MySQL e può essere recuperato con:

$this->encryption->decrypt($pin) .

Il problema con questo, dal punto di vista della sicurezza, è che l'applicazione PHP ha la chiave di crittografia memorizzata al suo interno in modo che possa eseguire questi metodi.

Non penso di poter utilizzare l'hashing in questa situazione, poiché ho bisogno di conoscere il vero valore dei dati.

Qualche suggerimento su un approccio per questo?

    
posta SBB 08.01.2018 - 20:52
fonte

2 risposte

2

Lo scopo della tua applicazione è quello di memorizzare un segreto e rivelarlo a un utente autorizzato al momento giusto. Questo non funziona senza poter decifrare detto segreto. Temo che qualsiasi soluzione in cui la tua organizzazione non sia completamente in grado di accedere al segreto non funzionerà. Quindi l'unica pratica di sicurezza che ti proteggerà dal peggiore dei casi è ovvia: "Non ci sono problemi di sicurezza nella tua applicazione."

Tuttavia, la crittografia dei dati a riposo nel database può ancora avere senso se si desidera compartimentare la conoscenza dei diversi reparti della propria azienda.

Ad esempio, se solo l'amministratore del server delle applicazioni ha accesso alle chiavi di decrittografia utilizzate nell'ambiente di produzione, è possibile concedere agli amministratori di database e agli sviluppatori l'accesso in lettura al database di produzione senza doversi preoccupare di rubare eventuali pin. La maggior parte delle questioni quotidiane sarà risolvibile senza richiedere i pin in chiaro. Tieni a mente che ci saranno ancora situazioni in cui per risolvere un problema qualcuno deve decifrare un pin nel database di produzione. Quindi assicurati che i tuoi processi consentano un'eccezione per queste situazioni.

Questo, ovviamente, si applica solo se la tua organizzazione è effettivamente abbastanza grande da rendere comprensibile tale compartimentalizzazione. Quando sei una piccola azienda in cui DBA, amministratore del server, sviluppatore e responsabile della sicurezza sono la stessa persona, tutto ciò è inutile.

Potrebbe anche essere d'aiuto in quelle situazioni in cui persone non autorizzate ottengono l'accesso in lettura al proprio database (ad esempio attraverso una configurazione errata di SQL injection o database server) ma non alla configurazione del server in cui è memorizzata la chiave di decrittografia. Ma ricorda che questo è solo un sottoinsieme limitato di possibili scenari di attacco.

Ma in ogni caso, fai attenzione a non sovraccaricare la crittografia dei dati a riposo. Più amica la tua soluzione, più bug avrai. E più bug ha, più situazioni avrai dove le persone sono costrette a guardare i dati decrittografati per correggere i suddetti bug.

    
risposta data 08.01.2018 - 21:24
fonte
0

Potrebbe essere utile esaminare le soluzioni per gestire il processo di crittografia e decrittografia dalla logica principale dell'applicazione.

Potresti provare ad incorporare un HSM o (HSM SaaS, come AWS CloudHSM ) per eseguire processi di crittografia e decrittografia, ridurre le eventuali variabili di sicurezza codificate nel codice e rendere difficile la manomissione anche da parte di persone con la propria organizzazione.

A seconda delle tue esigenze, potresti anche provare a un gestore dei segreti, come hashicorp-vault , o strumento di gestione delle identità privilegiato , come server segreto thycotic . Questi strumenti possono fare cose come la rotazione delle password, audit trail, ecc.

Dal tuo OP, non sono sicuro al 100% della tua logica, ma sembra che tu voglia assegnare il codice all'utente al momento dell'acquisto. In tal caso, puoi ridurre l'esposizione assegnando all'utente una prenotazione per un codice e poi tirandola solo quando lo richiedono e facendolo "solo una volta" -eg, hanno bisogno di annotarlo o non possono mai ottenere di nuovo o per lo meno lo fai solo esposto all'utente dopo che in realtà prima dicono di doverlo riscattare.

Anche in questo caso, l'utilizzo di un HSM può essere utile per mantenere sicuro l'elenco di codici PIN fino a quando non vengono assegnati o effettivamente utilizzati per gestire il compito.

Idealmente, ogni utente avrebbe una coppia di chiavi pubblica-privata e si potrebbe semplicemente crittografare il valore in modo che solo l'utente specifico possa decrittografarlo. Tuttavia, questo è piuttosto difficile da fai in un'app web .

Pensa a una configurazione simile a qualcosa come LastPass che memorizza le password delle persone , ma LastPass non lo fa 'Basta avere un grande database in chiaro delle password memorizzate delle persone.

Potresti anche essere interessato a dare un'occhiata a MIT Mylar e come si occupa della gestione e della protezione dei dati sensibili .

Dai un'occhiata:

Considera anche che devi pensare quando ottieni l'elenco di carte e spille dal tuo fornitore. Avrai bisogno di avere questo file protetto e quindi potresti avere file di intermediario seduti da questo processo. Ad esempio, guarda dove i dati possono essere esposti mentre si dirigono verso l'app / db in quanto potrebbero esserci altri posti per essere esposti.

    
risposta data 08.01.2018 - 22:45
fonte

Leggi altre domande sui tag