Ho un database MySQL che memorizza dati personali (personali) sensibili; e sono stati incaricati di garantire che questi dati siano crittografati in qualche modo per proteggere le persone e i loro dati se ad es. il server deve essere compromesso o un utente malintenzionato dal nostro provider di servizi di hosting accede al server senza autorizzazione. Il database viene utilizzato da un framework Web PHP che si trova sullo stesso server.
Sto lottando con un buon schema che consente di crittografare i dati e amp; impossibile leggere senza una corretta autorizzazione; mantenendo la funzionalità (indici, relazioni con il database, possibilità di rileggere i dati nel framework web). Quali sono le opzioni migliori?
Due approcci che ho considerato sono:
1) Crittografia di campi / dati specifici nel database con una chiave in modo che se il database viene compromesso, le informazioni in esso non saranno deducibili da un singolo utente (ad esempio, manteniamo indo e relazioni, ma le informazioni personali identificabili sono criptate ). L'app decodifica le informazioni utilizzando la chiave in fase di runtime. La sfida consiste nel modo in cui gestire la chiave: se è inserita nella logica dell'app o accessibile dalla logica dell'app come un file sullo stesso server, può comunque essere compromessa. Forse potrebbe essere posizionato su un altro server; ma sarebbe ancora necessario accedere in fase di esecuzione dalla logica dell'app; ad esempio, l'accesso alla logica dell'app consentirà di acquisire il possesso della chiave. Forse potrei memorizzare la chiave in memoria all'avvio del server; ma introduce un possibile problema di stabilità (servizio inattivo dopo il riavvio). Quali sono le opzioni? È un buon approccio?
2) Implementazione di una sorta di divisione logica dei dati tra le informazioni di identificazione personale e il database rimanente. Per esempio. una tabella con informazioni personali (nome utente, email) un indice; una tabella con i dati sensibili (ad esempio tabella di informazioni sulla salute) con un altro indice; e quindi introducendo un tipo di crittografia a chiave unidirezionale (p.es. per esempio link ) mappatura tra i due, dove il relazione tra le informazioni personali e amp; i dati sensibili possono essere creati (anche in fase di esecuzione dalla logica dell'app) se è possibile fornire una chiave per abbinare la tabella. Ma ancora una volta, mi imbatto sulla necessità di gestire l'accesso alla chiave utilizzata nello scenario di cui sopra; simile a sopra.
Che cosa è la migliore pratica?