Archiviamo gli indirizzi email degli utenti nel nostro database, come molti altri siti web. Mentre siamo orgogliosi delle misure di sicurezza in vigore, a volte "appena sufficiente" non è sufficiente.
Abbiamo iniziato a cercare una soluzione che ci consenta di archiviare gli indirizzi e-mail in un formato crittografato e recuperarli in un formato leggibile, ma - ed ecco il trucco - al di fuori della fonte del nostro codice PHP. Cioè, se qualcuno dovesse mai violare i nostri server e recuperare il nostro codice sorgente, le nostre password del database e tutto ciò che riguarda la nostra business intelligence, vorremmo che avesse ancora dati assolutamente inutili senza l'algoritmo di crittografia.
Quale sarebbe il modo migliore per farlo e ci sono soluzioni già pronte? Stavamo pensando qualcosa sulla falsariga di un modulo php o apache, o anche di un piccolo programma Go - qualsiasi cosa compilata che potesse essere eseguita molto velocemente e sarebbe inutilizzabile se rubata a causa della sua natura compilata.
Ciò che vogliamo è qualcosa del genere:
Le e-mail nel database verrebbero archiviate in questo formato
gibbweswwvsknvknsdva
sadjfoaisjdoiasjdoiasj
skdjfajsfoiajsdoij
whatever
Quindi, quando abbiamo fatto questo:
$email = $db -> getEmailById(30);
$email = decrypt($email);
la funzione di decriptazione verrebbe applicata alla decrittazione effettiva, ma all'esterno di php. Potrebbe chiamare il comando di sistema ed eseguire un file binario, qualunque sia. Ma qualunque sia il decrpyt restituito è la vera e-mail utilizzabile allora.
Questa e-mail decrittografata può quindi essere utilizzata come destinatario di un messaggio di posta elettronica inviato dal sistema, o come informazioni di contatto visualizzate sul profilo di un utente, ecc., ma se l'utente annulla il DB in qualche modo, tutto ciò che vede è il sopraindicato.
Modifica: tdammers ha chiesto perché questo deve essere esterno a PHP, ma richiamabile da PHP. Perché usiamo i valori effettivi degli indirizzi e-mail un paio di migliaia di volte al minuto, diversi per quello. Quindi la nostra app Web richiede sempre un accesso rapido ai valori leggibili, ma dobbiamo essere sicuri che qualcuno debba prendere il codice sorgente in qualche modo o il database stesso, non avrà valori utilizzabili. Può trattarsi di chiunque, da un hacker, a una parte del codice che viene esposta a causa di un bug critico o di un insoddisfatto dipendente 5 minuti dopo essere stato licenziato, non lasciando a noi il tempo di revocare il suo accesso.