Ho creato un algoritmo che credo utilizzerò per un servizio di cloud storage che sto sviluppando, se non ci sono problemi o vulnerabilità con esso. È questo insieme a TLS e la sicurezza in avanti implementata. Inoltre, quando effettui il login su un nuovo dispositivo devi confermare tramite il tuo account di posta elettronica.
Per creare un account:
-
Genera due chiavi casuali, la chiave A e la chiave B. La chiave A viene utilizzata per dimostrare l'identità di chi sta effettuando l'accesso. La chiave B viene utilizzata per crittografare i file con AES-256.
-
Cifra le due chiavi con AES-256 usando un hash della password dell'utente. Pubblicherò presto una domanda a parte su come creare intenzionalmente un ritardo nella funzione di hashing, per prevenire attacchi di forza bruta.
-
Invia le chiavi crittografate al server, insieme a un hash SHA-256 della chiave A.
Per accedere:
-
Scarica le chiavi crittografate dal server.
-
Decrittografa le chiavi con la password con hash.
-
Carica la chiave A sul server.
-
Il server blocca la chiave A e la confronta con l'hash memorizzato. Se i due sono identici, comunica al client che la password è corretta (non che è stata inviata oltre).
-
Elimina la copia della chiave A in memoria dal server.
Per apportare modifiche ai file:
-
Accedi utilizzando i passaggi sopra indicati. Il server rifiuterà qualsiasi azione a meno che abbia effettuato l'accesso, ovviamente.
-
Cifra tutti i file con AES-256 utilizzando la chiave B (archiviata in memoria sul client, mai memorizzata in chiaro sul server) prima di inviare online. Decrittografa tutti i file offline di conseguenza.
Per cambiare la password:
-
Accedi utilizzando i passaggi precedenti.
-
Encrypt Key A e Key B (memorizzati in memoria dopo l'accesso) con l'hash della nuova password.
-
Indica al server di eliminare le chiavi crittografate e di caricare quelle nuove.
Per ripristinare password e chiavi (in caso di violazione):
-
Accedi. Se non puoi farlo con la password e i passaggi precedenti perché la tua password è stata cambiata, usa un'unità di ripristino (facoltativamente creata quando imposti un nuovo account) con le chiavi memorizzate su di essa.
-
Scarica tutti i file dal server.
-
Decifra i file con la chiave B.
-
Genera due nuove chiavi casuali, quindi cripta le nuove chiavi con la nuova password e caricala, insieme a un hash della nuova chiave A.
-
Il server memorizza nella cache le chiavi crittografate e l'hash e invia un'email di conferma per reimpostare la password e le chiavi dell'account.
-
Una volta accettata l'e-mail di conferma, il client inizia a crittografare i file con la nuova chiave B e li carica sul server. Una volta trasferiti tutti i file, il server rimuove i vecchi file.
-
Tutte le chiavi sono invalidate, la disconnessione dall'account su tutti gli altri dispositivi.
Per favore fammi sapere se ci sono problemi con questo algoritmo o miglioramenti che potrei apportare.