OpenPGP
Il modo standard di gestirlo è archiviare i messaggi crittografati nel formato standard OpenPGP .
C'è qualche ragione per non usare una libreria pronta all'uso che implementa RFC 4880 e RFC 3156 ?
(Esistono molte discussioni pratiche su OpenPGP su questo sito di sicurezza IT e discussioni più teoriche su OpenPGP nel sito Cryptography StackExchange ).
Il messaggio crittografato in formato OpenPGP può essere archiviato come un file, un BLOB SQL, ecc.
informazioni
OpenPGP funziona esattamente come spiegato fin1te
(per quanto posso dire, openssl_seal () funziona esattamente allo stesso modo):
- Per ogni messaggio, il sistema genera una nuova, casuale chiave di sessione che nessun altro potrebbe indovinare. Dopo aver memorizzato il messaggio BLOB completo cifrato, il sistema dimentica immediatamente quella chiave.
- Il testo in chiaro del messaggio viene crittografato con quella chiave di sessione e memorizzato nel pacchetto di dati crittografato simmetricamente all'interno del BLOB.
- Diversi pacchetti di chiavi di sessione crittografate sono memorizzati all'interno del BLOB, ognuno dei quali contiene un'altra copia identica della chiave di sessione per questo messaggio, ognuno crittografato con una chiave pubblica diversa. In questo caso, una copia viene crittografata con la chiave pubblica del mittente e un'altra copia viene crittografata con la chiave pubblica dell'amministratore.
Quando qualcuno (l'utente o l'amministratore di sistema) desidera leggere un messaggio crittografato,
quella persona dà il messaggio crittografato e la sua passphrase a un pezzo di software che la decrittografa e le mostra il testo in chiaro.
Tipicamente quel software:
- Alimenta la passphrase in una funzione di derivazione della chiave. Il software utilizza la chiave risultante per decodificare un file keyring per ottenere la chiave privata dell'utente e la relativa chiave pubblica corrispondente. (In alternativa, suppongo che si possa usare una funzione di derivazione della chiave direttamente genera una chiave privata da una passphrase , quindi genera la chiave pubblica da quella chiave privata).
- cerca tutti i pacchetti di chiavi di sessione crittografati all'interno del BLOB finché non ne trova uno con una chiave pubblica corrispondente.
- Utilizza la chiave privata per decrittografare la chiave di sessione. Quindi utilizza la chiave di sessione per decrittografare il messaggio in chiaro.
Finché si evita di inviare la password su HTTP o altri protocolli in chiaro,
questo sembra sicuro contro gli attacchi passivi (guardando ciò che succede sul filo, leggendo i nastri di backup del server, incluse tutte le chiavi pubbliche e il portachiavi crittografato dell'amministratore).
EDIT:
where should I save encrypted keypair?
Questa è una domanda eccellente, degna di una pagina di domande / risposte completamente nuova.
In un mondo ideale, assegneresti a ciascun utente un token di sicurezza che, una volta acceso, generava una nuova coppia di chiavi e ti dava la chiave pubblica, ma la chiave privata non avrebbe mai lasciato il token.
Nel nostro mondo tutt'altro che ideale, molte persone usano Gnome Keyring o qualche software simile per archiviare la coppia di chiavi criptata sul proprio laptop o smartphone personale, come discusso a
"formati standard di archiviazione delle chiavi private?" .
Sospetto che preferiresti un sistema in cui non devi acquistare un certo numero di token di sicurezza e in cui gli utenti potrebbero comunque accedere ai propri file sul server anche se il loro smartphone è stato accidentalmente perso, danneggiato o distrutto in alcuni altro modo.
Questo praticamente ti costringe a memorizzare un keyring crittografato sul server -
"Questo modello di crittografia lato client è sicuro?"
discute alcune delle implicazioni.