Puoi ricorrere a un database MySQL, per sfruttare il suo supporto per la crittografia .
Quindi hai due opzioni (in realtà puoi utilizzarle entrambe):
1) Alcuni dati possono essere lasciati in testo semplice, ma resi anonimi - cioè, non c'è modo di sapere a chi si riferiscono i dati.
2) Altri dati sono crittografati, utilizzando un algoritmo simmetrico. La chiave per farlo sarà casuale e crittografata usando la password dell'utente. In questo modo, diversi utenti possono accedere agli stessi dati
User Password CryptoKey
alice <hash1> <encrypt(pwd1, RANDOM)>
bob <hash2> <encrypt(pwd2, RANDOM)>
Per autenticare, Alice invia la sua password, che viene controllata con l'hash memorizzato. Se è valido, la chiave RANDOM viene estratta e archiviata nella memoria del server per la durata della sessione.
I campi Testo e BLOB possono quindi essere crittografati (con o senza salatura). Brevi campi o campi con cardinalità bassa sono meglio salati, altrimenti il contenuto può essere facilmente indovinato: ad esempio un campo che contiene 'Maschio' o 'Femmina', dopo la crittografia non salda potrebbe contenere 'e3290d6cd47a701168b962aa0c6b249e' o 'd87d344d4808900421c93de58dd7557a' - ma questo è ancora solo due valori, che è una potenziale vulnerabilità.
Cambiare la password di Alice non è un granché; naturalmente, se RANDOM viene esposto, questo è un grosso problema. Le comunicazioni con il front-end dovrebbero passare attraverso SSL / TLS e contenere dati RANDOM decrittografati (ma crittografati con SSL), proteggendo così la sicurezza di RANDOM, che non lascia mai il server.
Inutile dire che l'accesso fisico alla memoria del server comprometterà tutto, dal momento che sarebbe facile eseguire un attacco man-in-the-middle e indurre un utente valido a rivelare la sua password, da cui è possibile ottenere RANDOM e l'archivio dati decrittografato.
Opzionalmente, puoi crittografare anche la connessione al database , ma sembra un po 'eccessivo (probabilmente saranno locali comunque) e comunque non ti proteggerà dal server che viene sfruttato.
I dati possono essere sincronizzati tra un database MySQL locale e remoto senza conoscere la password, scaricando un dump del database (che è fattibile se la dimensione dei dati è piccola, ricorda che i dati crittografati non sono comprimibili ) o mantenendo un registro degli aggiornamenti, che è molto più difficile (pensa 'Alice sul suo laptop modifica un record mentre Bob sul suo desktop cancella quello stesso record, e Charlie inserisce un nuovo record con una nuova chiave primaria ... ').
Francamente, la soluzione migliore che ho trovato in questi casi è quella di posizionare tutto su un server affidabile con un piano di backup appropriato e fare in modo che i client si connettano al server. Di solito è più veloce ed economico fornire ai client non connessi con connettività Internet piuttosto che progettare il database per l'utilizzo offline, la sincronizzazione e la risoluzione dei conflitti. Le copie Sola lettura potrebbero essere distribuite, ovviamente. Solitamente il server remoto può essere configurato per inviare e-mail ed eseguire lavori cron e informare i clienti di qualsiasi evento (ad es. "Janie ha conseguito il premio A2").
Esponendo solo un'interfaccia REST, è possibile sfruttare diversi framework applicativi e avere anche un'applicazione lato server più semplice e testabile (i punti di ingresso e i percorsi del flusso di lavoro sono pochi in base alla progettazione e possono essere enumerati), il che riduce sensibilmente il rischio di exploit del server.
Un'altra possibilità
Dato che il database master risiede su un server centrale e una copia delle stesse vite locali, è possibile mantenere l'applicazione e il database su una chiave USB esterna crittografata. Il database stesso non ha crittografia; potresti utilizzare SQLite
localmente. Se utilizzi MySQL, puoi eseguirlo tramite App per dispositivi portatili o qualcosa di simile.
Quindi, il flusso di lavoro sarebbe: l'utente inserisce la chiave USB, che richiede un PIN o anche un impronta digitale . Una volta sbloccato, può eseguire l'applicazione, che se necessario (ad esempio MySQL, PostgreSQL, ...) attiverà il server e si connetterà ad esso; o accederà direttamente ai dati (SQLite). Al termine, il server (se presente) viene arrestato, la chiave viene espulsa e i dati su di esso sono a prova di ogni ragionevole minaccia.
Tornando all'intervallo di connettività, l'utente attiva nuovamente l'applicazione e la sincronizza con il server centrale.
Questa soluzione ha il vantaggio che la sicurezza è un plug-in con un costo noto. Gli utenti possono decidere di non pagare quel costo, ma è la loro decisione , non il tuo .