Prima di decidere su questioni di sicurezza, è necessario valutare il modello di minaccia. Senza un'idea su cosa ti stai difendendo, qualsiasi misura che prendi sarà di scarso valore.
Ora, ci sono alcune cose di cui potresti preoccuparti in questo contesto:
- Gli hacker che ottengono l'accesso fisico ai tuoi dati (ad es. irrompere nel data center, rubare i nastri di backup, ecc.)
- Gli utenti che ottengono l'accesso in lettura al tuo database non elaborato
- Gli hacker che compromettono la tua richiesta, ad es. tramite SQL injection, overrun del buffer, ecc.
Per il primo scenario, il salvataggio del database e di tutti i backup su volumi crittografati dovrebbe funzionare, a patto che il server non abbia headless: rubare il server oi nastri richiederebbe quindi la rottura della crittografia a livello di disco.
Per il secondo scenario, la crittografia dei dati del database è di aiuto, ma solo se non si memorizzano le chiavi o le frasi d'accesso necessarie in qualsiasi luogo.
Nel terzo scenario, tutto dipende dal contesto in cui si verifica l'attacco: se è, ad esempio, un attacco XSS o CSRF, allora un utente malintenzionato può fare tutto ciò che l'utente legittimo può fare, e la crittografia dei dati non lo fa aiuto a tutti.
Il modello di minaccia, quindi, è un utente malintenzionato che ottiene l'accesso in lettura al database non elaborato, trovando le credenziali di accesso e riuscendo a collegarsi al server del database dall'esterno o ottenendo l'accesso come root al server del database. Un percorso tipico è quello di ottenere prima l'accesso alla shell sul server web; da lì, un utente malintenzionato può quindi leggere le credenziali di accesso dal file di configurazione e connettersi al database.
Un'ulteriore considerazione è dove mantieni le chiavi e i passphrase, specialmente se stai usando una piattaforma con un modello di esecuzione senza stato come PHP. Idealmente, è possibile che il cliente digiti la propria passphrase quando richiesto, e lo tenga solo in memoria, o ancora meglio, esegua la decrittazione lato client (ma ciò non è spesso fattibile). Su una piattaforma senza stato, lo stato viene solitamente portato avanti usando sessioni, memcache, database o file flat; ma tutti questi sono molto più vulnerabili rispetto al mantenimento dello stato nella memoria di un'applicazione web di stato. Evitare questo è un problema di pollo e uova, perché se si cripta lo stato prima di persisterlo, si è appena creato un altro segreto che bisogna ricordare in sicurezza. Ricordare la passphrase sul client e inviarlo insieme ad ogni richiesta che ne ha bisogno potrebbe essere la soluzione meno orribile di allora; il cliente è ancora vulnerabile in caso di perdite XSS, e devi prendere le consuete precauzioni (servire solo https, impostare tutti i cookie su httponly e sicuro, ecc.), ma questi sono problemi che hai comunque.