Obiettivi
Sto implementando un sistema basato sul web che ha i seguenti obiettivi:
-
Gli utenti sono in grado di memorizzare segreti (potrebbero essere password o un intero file) sul server.
-
Il server non ha conoscenza delle chiavi per la decodifica. In modo che se il server è compromesso, l'utente malintenzionato non sarebbe in grado di decrittografare i segreti.
-
I segreti possono essere condivisi tra gli utenti.
design
La minaccia principale di cui sono preoccupato per gli scopi di questa domanda è il compromesso del server. Voglio assicurarmi che se un utente malintenzionato accede al server o al database (offline o online), non vengono esposti segreti. Capisco che ci sono altre minacce, come un account utente compromesso. Saranno predisposte altre sicurezze per proteggerle.
Ho deciso che è più sicuro che il server non veda mai un segreto in chiaro o il materiale chiave. Pertanto, tutta la crittografia viene eseguita sul lato client. Sto utilizzando asmCrypto .
-
HTTPS viene utilizzato per tutte le comunicazioni client / server. Gli utenti richiedono account, esiste già un sistema di autenticazione.
-
Gli utenti generano una coppia di chiavi RSA personale (2048-bit, e = 65537). La chiave privata viene crittografata con AES-GCM utilizzando una chiave generata da PBKDF2 in base alla passphrase fornita dall'utente. Il nonce AES è generato dal server per garantire univocità. La chiave pubblica dell'utente e la chiave privata crittografata vengono inviate al server per essere memorizzate.
-
Quando un utente salva un segreto, genera una chiave univoca casuale (K) per quel segreto. Criptano il segreto con AES-GCM usando K e un nonce fornito dal server. Quindi crittografano K utilizzando la propria chiave pubblica e il padding OAEP. Inoltre, possono crittografare K con la chiave pubblica di un altro utente. Le copie crittografate di K vengono inviate al server.
-
Per leggere il segreto (possibilmente da un altro computer), un utente deve recuperare la sua chiave privata crittografata dal server. Decifrano la loro chiave privata lato client fornendo una passphrase, che viene inserita in PBKDF2 per generare la chiave AES. Una volta decodificata la chiave privata RSA, possono decrittografare la chiave segreta (K) e successivamente il segreto.
Domande
So che ci sono molte insidie e potenziali trucchi con la crittografia. Ho fatto molte letture per cercare di capire come utilizzare al meglio questi algoritmi (ad esempio, il nonce unico per AES-GCM, il valore di e per le chiavi RSA e l'importanza dell'utilizzo di padding appropriato). Tuttavia, non sono del tutto sicuro che questo sia un progetto ragionevole.
Quali difetti vedi in questo disegno?
Le scelte di algoritmi e parametri sono corrette?
C'è un modo per giudicare la qualità della libreria asmCrypto?
Mi manca una soluzione più semplice e ovvia?