Sto cercando di progettare un sistema che consenta ai membri dello staff della nostra piccola azienda di condividere in modo sicuro le informazioni sensibili dei clienti (testo) e visualizzarle su una pagina Web insieme a comunicazioni meno sensibili. Intendo usare PHP perché è quello che so meglio.
La sfida principale è che i dati devono essere archiviati sul server, ma è necessario molto tempo per renderli utili se il server viene compromesso.
La mia idea è la seguente:
-
Quando viene creato un utente dello staff, sceglie una password sicura e questa viene sottoposta a hash usando bcrypt (12) e archiviata nel nostro database. La semplice password viene anche utilizzata per creare una coppia di chiavi RSA 4096 bit utilizzando OpenSSL. Entrambe le chiavi sono memorizzate sul server.
-
Quando viene creata una nota sicura, viene crittografata con la chiave pubblica di ogni membro dello staff e ogni copia viene archiviata nel database.
-
Quando un membro del personale effettua l'accesso, la sua password semplice viene confrontata con l'hash per vedere se corrispondono. Se lo fanno, la semplice password, l'IP del client e l'ID utente sono serializzati e simmetricamente crittografati usando mcrypt. La chiave utilizzata per crittografare la stringa è archiviata nel file system del server. Il testo cypertext viene quindi inviato come cookie al client.
-
Quando un membro dello staff accede a un'altra pagina, il server decrittografa il cookie e utilizza la semplice password e la chiave privata dell'utente per decrittografare qualsiasi informazione sensibile in tale richiesta e invia le informazioni sensibili al browser dell'utente.
Il tutto sarà su HTTPS con crittografie sicure.
Sono consapevole che questo è probabilmente molto difficile da rendere completamente sicuro, ma mi piacerebbe sapere se qualcuno può individuare difetti evidenti in questa configurazione che può essere ragionevolmente migliorata. In generale, sarebbe anche utile sapere quanto è utile una chiave privata senza la password sicura associata.