Non sono sicuro che questa domanda si adatti meglio a StackOverflowSE o CryptoSE ma penso che questo sia il posto giusto.
In un portale della comunità online voglio salvare i messaggi privati degli utenti crittografati in un database in modo che le informazioni non possano essere trapelate se qualcuno accede al database. Ma non ho idea di come gestire le chiavi.
Quando viene inviato un messaggio, deve essere salvato crittografato nel database e dovrebbe essere decifrabile soltanto se uno dei partecipanti sta richiedendo il messaggio. La chiave ovviamente non deve essere salvata nel database in quanto ciò renderebbe il tutto inutile.
Il modo in cui sono arrivato è di salvare il messaggio con un algoritmo a chiave simmetrica e salvare la chiave crittografata con un algoritmo a chiave pubblica per ogni partecipante (ogni utente ha una chiave pubblica).
Quando viene richiesto un messaggio, viene decodificato utilizzando la chiave privata dell'utente per ottenere la chiave simmetrica. Tuttavia non ho idea di come creare / salvare una chiave privata. Non deve essere nel database e poiché l'applicazione è multi-piattaforma (web, accesso mobile) non posso salvarlo sul dispositivo dell'utente e deve essere generato al volo usando una costante che proviene dall'utente e non è salvato da qualche parte nel database. L'unica costante che riesco a trovare è la password dell'utente. Ma nel caso in cui la password viene persa / dimenticata non c'è più modo di accedere ai messaggi.
La mia domanda: c'è un altro modo per farlo? O conosci un'altra costante che è ancora privata?
Modifica / Aggiornamento: Grazie per le tue risposte. Ecco un aggiornamento:
Che dire del salvataggio della chiave privata in db crittografata con una stringa casuale che è inviata all'utente in una mail una volta alla registrazione? Si consiglia all'utente di non cancellare quella mail. Se lo fa ancora (sembra abbastanza probabile) allora posso biasimarla, beh no j / k, ma questo sarebbe almeno un modo per recuperare i messaggi.
Ecco una domanda secondaria: l'accesso all'applicazione è possibile solo tramite HTTPS o TCP / IP + API SSL. È possibile salvare in en / decryt il messaggio sul server e inviarlo in chiaro su SSL? Altrimenti dovrei cercare implementazioni (come GPG) per tutte le piattaforme (browser, mobile, desktop). Ciò richiede di memorizzare la chiave privata nella ram per il tempo in cui l'utente ha effettuato l'accesso (la password viene inviata all'avvio / login della sessione). Certo, se qualcuno ottiene l'accesso in scrittura al server (altera l'applicazione) o legge l'accesso alla ram (o0), potrebbe annusare i tasti ma non penso sia probabile.
Il messaggio deve essere * en * criptato sul server (significa inviato in chiaro) in ogni caso, poiché potrebbe essere necessario inviarlo ai dispositivi mobili dal server. (Non è importante che sia sicuro o meno, voglio assicurarmi che nessuno possa usare un dump del database - non se Apple o simili possono leggerlo mentre viene consegnato).
Probabilmente non ho bisogno di nulla di tutto ciò visto che probabilmente i miei utenti non invieranno messaggi segreti tra loro, ma in caso di perdite non saranno contenti. È una comunità per studenti locali e non sai mai cosa sono gli studenti CS annoiati;)