Come si memorizza la chiave segreta di un utente su un server?

5

In questo momento sto imparando sulla sicurezza e una cosa che vorrei provare è che un server delle chiavi distribuisca le chiavi ai client che consentano loro di salvare e leggere i dati in modo sicuro localmente.

La mia idea di base è che il client comunichi con il server su TLS dove fornirà un nome utente e una password. Questa password verrà utilizzata per autenticare l'utente e decrittografare la chiave nel database.

In sostanza, il database dei server delle chiavi dovrebbe essere strutturato in questo modo:

| Nome utente | Hashed Password + Salt | Salt | Chiave crittografata |

In questo caso, le chiavi sarebbero sicure in caso di perdita di un database? Mi chiedo se esiste una best practice per questo tipo di implementazione o dovrei gestirla in modo diverso?

    
posta Eoin Nolan 10.04.2014 - 20:44
fonte

3 risposte

1

(Disclaimer: io stesso sono uno "studente della sicurezza", quindi non sono sicuro al 100% se è corretto.)

Non capisco perché vorresti mantenere le chiavi private sul server dopo che sono state trasferite all'utente. Non serve a loro. Se sono persi, creane di nuovi.

Le chiavi hanno una parte pubblica e una privata. La parte pubblica può essere davvero pubblica e può essere pubblicata sul web.

Le chiavi private dovrebbero essere private, e questo dovrebbe significare che gli utenti hanno le loro chiavi sulla propria macchina (laptop, telefono ecc.), forse persino una chiave univoca per ogni macchina. Dovrebbero essere istruiti su come mantenere la chiave al sicuro lì. Mi viene in mente una password. Se si creano le chiavi per l'utente sul server, è necessario un modo per ottenere la chiave privata in modo sicuro per l'utente. Questo può essere fatto localmente, tramite SSH, o tramite chiavetta USB, ecc. Crea i tasti giusto prima di trasferirli, quindi cancellali.

Forse mi manca qualcosa, un buon motivo per tenere le chiavi sul server - quindi spiegami perché.

    
risposta data 10.04.2014 - 22:01
fonte
1

La complessità è il nemico della sicurezza. Così sta abbandonando il controllo dei bit importanti, come le chiavi, quando non è necessario.

A quanto ho capito, il tuo schema funziona in questo modo:

  1. L'utente avvia l'app client che può accedere ai file locali crittografati
  2. L'utente inserisce a) nome utente e b) password
  3. Nome utente e password vengono trasmessi al server
  4. Il server autentica l'utente con nome utente e password
  5. Il server utilizza un KDF per ricavare una chiave di crittografia dalla password dell'utente
  6. Il server decrittografa la chiave memorizzata dell'utente utilizzando il tasto derivato
  7. Il server trasmette la chiave decrittografata all'app client
  8. L'app client decrittografa i file utilizzando il tasto

Tuttavia, tutto ciò di cui hai veramente bisogno sono 1, 2b, 5 e 8. I passaggi 2a, 3, 4, 6 e 7 non sono necessari e aggiungono semplicemente dei rischi.

Nel modello più semplice:

  1. L'utente avvia l'app client che può accedere ai file locali crittografati
  2. L'utente inserisce la password
  3. L'app client locale utilizza un KDF per ricavare una chiave di crittografia dalla password dell'utente
  4. L'app client decrittografa i file utilizzando il tasto

In questo modello, non è richiesta la memorizzazione persistente delle chiavi, nessun server in possesso di un tesoro di chiavi e hash crittografati che potrebbero essere attaccati e utilizzati per la password brute-force, nessuna trasmissione Internet di dati sensibili.

La tua domanda non menziona alcun motivo particolare per volere o bisogno di un server che memorizza le chiavi. Assente quel bisogno, penso che dovresti ripensare al tuo modello di minaccia, perché il design attuale non ha molto senso per me.

    
risposta data 10.07.2014 - 00:23
fonte
1

Le tue chiavi potrebbero essere sicure, in funzione, tra l'altro, della crittografia utilizzata e di quanto siano forti le password degli utenti. Ma c'è un modo per renderlo molto più sicuro: non memorizzarli.

Nel tuo sistema così come lo descrivi, non c'è motivo per non lasciare che il cliente si occupi dell'intera crittografia / decrittografia. Pertanto, il server non ha alcun senso nel conoscere le chiavi di crittografia utente. Memorizzare le chiavi sul server in realtà aggiungerà rischi sostanziali e inutili:

  • il tuo server può essere violato, il tuo database rubato e le chiavi recuperate

  • devi inviare queste chiavi sulla tua rete, dove potrebbero essere intercettate

L'unica ragione (per quanto cattiva) che posso vedere per voi di voler memorizzare le chiavi utente nel database è di poterla restituire se un client perde la sua chiave. Tuttavia questo non dovrebbe preoccuparti perché non dovrebbe accadere. La memorizzazione di una chiave privata è una questione molto delicata che deve essere gestita con estrema cautela. Non è qualcosa che "perdi".

    
risposta data 10.07.2014 - 01:56
fonte

Leggi altre domande sui tag