Sto lavorando a un programma proof-of-concept per crittografare le e-mail con meno difficoltà per gli utenti finali con un processo come:
Per creare un account:
- Genera un salt casuale e IV e ottieni una password dall'utente.
- Genera una chiave a 384 bit con PBDKF2-HMAC-SHA512 (o forse scrypt?).
- Dividilo in tre chiavi a 128 bit (k1, k2, k3).
- Genera una coppia di chiavi RSA (per GPG ).
- Cripta la chiave privata con k3.
- Genera un HMAC della chiave privata crittografata, utilizzando k2.
- Invia sale, IV, k1, numero di iterazioni, chiave pubblica, HMAC e chiave privata crittografata al server.
Per accedere:
- Richiedi il nostro numero di sale e il numero di iterazioni dal server (forse fai qualcosa qui per evitare la fuoriuscita di indirizzi email).
- Rigenera k1, k2, k3 con PBKDF2.
- Invia k1 al server, che lo controlla rispetto alla versione memorizzata. Questo è usato per evitare di rendere pubblica la chiave crittografata. In teoria, questo non dovrebbe avere importanza, ma sembra meglio proteggere i dati crittografati per ogni evenienza.
- Se k1 corrisponde, il server restituisce una chiave privata crittografata AES-128 e IV, con un MAC HMAC-SHA-1.
- Usa k2 per verificare l'HMAC.
- Utilizza k3 per decrittografare la chiave privata.
Per gli accessi futuri, possiamo semplificare le cose dal momento che il server ha la chiave pubblica e abbiamo la chiave privata.
L'idea è che anche se il server è compromesso, l'unica informazione che ha è k1, sale, IV e la chiave privata crittografata, ma per fare casino con la chiave, ha bisogno di k2 e per decodificare la chiave ha bisogno di k3.
Poiché il client deve solo decodificare la chiave una sola volta (e può quindi memorizzarla nel portachiavi del sistema operativo), il numero di iterazioni potrebbe essere molto alto.
Sono corretto supponendo che ciò possa proteggere i clienti da un server compromesso? Penso che i soli vettori di attacco rimasti sarebbero hackerare il client, forzare brute la password (che dovrebbe essere incredibilmente difficile, dato che possiamo usare molte iterazioni di PBKDF2) e la crittoanalisi dei tubi di gomma.
EDIT: Più specificamente, questo è inteso a proteggere la password di un utente, la chiave privata e le e-mail crittografate da un utente malintenzionato, anche se quell'attaccante sta lavorando con il proprietario del server. Le e-mail non cifrate sono praticamente impossibili da proteggere, dal momento che un hacker che controlla il server potrebbe salvarle tutte via via che entrano. La crittanalisi del social engineering e del tubo di gomma sono rilevanti, ma il mio obiettivo era principalmente quello di ridurre i possibili attacchi a quelli che possono essere tenuto segreto.