Per scopi di apprendimento sto cercando di creare un'applicazione web (Symfony2, PHP) che consenta agli utenti di pubblicare contenuti e avere il proprio vault della password, tutto crittografato. Poiché desidero che gli utenti siano in grado di condividere password e contenuti crittografati, ho scelto la crittografia asimmetrica per generare una coppia di chiavi per ciascun utente.
Memorizzerò le coppie di chiavi degli utenti nel database ma crittograferò ciascuna chiave privata dell'utente con AES-256. Quando l'utente effettua l'accesso, dovrebbe essere in grado di visualizzare le password e i contenuti a cui ha accesso senza alcun input aggiuntivo dell'utente.
Questa è l'idea generale.
Ora la soluzione pratica.
Crea utente
- Genera chiavi a 4096 bit
- Genera chiave di sessione, PBKDF2 (password utente)
- Cripta la chiave privata con la chiave di sessione
- Memorizza la chiave nel database
Crittografa contenuto / password
- Genera una chiave di archiviazione casuale
- Cripta la password con la chiave di archiviazione usando AES-256
- Codifica la chiave di archiviazione con la chiave pubblica dell'utente
- Archivia chiave di archiviazione crittografata
Accesso utente
- L'utente inserisce la password
- Calcola la chiave di sessione dalla password, PBKDF2 (password utente)
- Memorizza la chiave di sessione nella sessione
- L'utente richiede il contenuto crittografato - decrittografa la chiave di archiviazione con la chiave privata dell'utente
- Decrittografa contenuto / password (AES-256) con chiave di archiviazione
Per come la vedo io, ci sono due principali svantaggi con questo schema.
-
Conservo la chiave di decodifica (chiave di visione) nella sessione degli utenti, che non sono sicuro se è scritta nella cartella / tmp. Un utente malintenzionato potrebbe forse utilizzare una qualche forma di dirottamento della sessione o se avesse accesso al server, leggere la cartella / tmp.
-
La chiave privata degli utenti non è protetta da passphrase!
Soluzione?
-
Crittografia di sessione? O forse non è necessario dal momento che symfony2 gestisce i dati di sessione in modo sufficiente?
-
Genera una stringa casuale da utilizzare come passphrase, crittografare questa passphrase e archiviarla nel database. Oppure usa PBKDF2 (chiave di sessione) come passphrase?
L'obiettivo è essere in grado di proteggere le password degli utenti e amp; contenuto il più possibile, anche se l'autore dell'attacco ha accesso al database o al server.
Il mio piano sembra "buono", o dovrei semplicemente eliminarlo? Qualsiasi feedback?