Come vengono memorizzate le chiavi di crittografia simmetriche?

5

Se hai una chiave simmetrica negoziata tramite protocollo SRP tra un dispositivo mobile (ad es. smartphone) e un server , quale sarebbe un modo sicuro per mantenere questa chiave risultante su ciascun lato?

Sul lato client è possibile utilizzare PBKDF2 o una funzione di derivazione della chiave simile per generare una chiave da utilizzare per crittografare / decodificare la chiave simmetrica prima di utilizzarla. Questo sarebbe considerato (accettabilmente) sicuro?

Quali possibilità ci sono sul lato server? Quale procedura sarebbe considerata sicura per memorizzare tale chiave in un database?

In che modo Amazon memorizza le proprie chiavi simmetriche utilizzate per l'autenticazione della stringa di query per S3? (Per informazioni: Su S3 è possibile limitare l'accesso agli oggetti memorizzati in modo che solo le richieste con una firma valida (creata utilizzando HMAC) abbiano accesso all'oggetto richiesto (limitato))

    
posta MSc 30.03.2015 - 13:55
fonte

2 risposte

1

Le chiavi segrete (simmetriche o asimmetriche) sono generalmente memorizzate in un supporto crittografato di qualche tipo, ad esempio un archivio di chiavi o un database crittografato. Un esempio specifico di un keystore potrebbe essere JKS (Java Key Store) e un database SQLCipher. Questo supporto crittografato è protetto da una password principale, necessaria per leggere / scrivere su di esso. SQLCipher prima scambierà la password con PBKDF2 per assicurarsi che abbia abbastanza entropia e costi computazionali.

La questione di dove viene memorizzata la master password influirà ovviamente sulla sicurezza del tuo sistema. Per il lato client, aspettarsi che l'utente lo ricordi è l'opzione migliore. Per il lato server, un Hardware Security Module (HSM) può essere usato per proteggere le chiavi come Key Management Service .

    
risposta data 09.04.2015 - 00:54
fonte
0

On the client side you could use PBKDF2 or a similar key derivation function to generate a key to then use to encrypt/decrypt the symmetric key before using it. Would this be considered (acceptably) safe?

Questo dipende in realtà da alcune cose:

1. Qual è il modello di minaccia?

Chi stai cercando di impedire di attaccarti? Uno stato nazione? Un altro geloso e significativo? Un copione per bambini? Questa persona avrà accesso fisico al dispositivo del cliente? Ecc.

2. Che cosa stai utilizzando come input per il tuo KDF (PBKDF2 nel tuo esempio)?

Speriamo che l'input per il KDF sia qualcosa che non è persistente sul dispositivo (ad eccezione del sale e dei round, puoi lasciarli in giro) ma piuttosto qualcosa di sufficiente entropia che l'utente è costretto a inserire una volta (es. una passphrase) e quindi viene cancellato dalla memoria quando non è più necessario.

3. Come stai crittografando e memorizzando le chiavi?

Se è disponibile un hardware dedicato affidabile (ad esempio, TPM o HSM [presumendo che tu ti fidi di questi]), questi ti forniranno un modo per memorizzare le tue chiavi simmetriche (alcune li memorizzano sull'hardware dedicato e alcune le crittografano con una chiave che è memorizzato sull'hardware ma memorizza il testo cifrato risultante sul dispositivo di archiviazione). Se tale hardware non è disponibile, di solito le chiavi vengono memorizzate in un keystore che è fondamentalmente un file (o un insieme di file) che memorizza le chiavi in modo crittografato. Esistono già diverse implementazioni là fuori, ma se hai intenzione di eseguire il rollover (cosa che faccio NOT recommend) allora devi considerare come proteggere la riservatezza e l'integrità delle tue chiavi crittografate. Alcuni aspetti da considerare sono:

  • Ogni chiave da crittografare sarà incapsulata con un KEK diverso?
  • Come otterrai ogni KEK?
  • Quali algoritmi / modalità userete?
  • Di quale tipo di prestazioni hai bisogno?

4. Cosa fai con le chiavi in memoria quando non ne hai più bisogno?

Ogni copia di ogni chiave dovrebbe essere cancellata dalla memoria una volta che non sono più necessari. Ci sono dibattiti su come fare ciò che va dalla semplice scrittura di un gruppo di zeri sui byte in memoria a fare cose più fantasiose che coinvolgono più passaggi che ciascuno scrive byte diversi nell'area della chiave in memoria. Quello che fai dovrebbe dipendere dal tuo modello di minaccia.

What possibilities are there on the server side? What procedure would be considered safe to store such a key in a database?

Il lato server ha opzioni molto simili. Idealmente il server userebbe un HSM e memorizzerebbe le chiavi (vedi sopra 3 per maggiori dettagli) e l'applicazione lato server non avrebbe mai accesso ai byte delle chiavi non formattate (solo HSM). Nel database è sufficiente memorizzare l'alias della chiave (è possibile utilizzare HSM per garantire l'integrità del binding tra il record del database e l'alias).

How does for example Amazon store their symmetric keys used for their query string authentication for S3?

Non sono sicuro di ciò che Amazon fa specificamente per l'autenticazione stringa di query per S3, ma so che forniscono un Servizio Cloud HSM .

    
risposta data 20.04.2015 - 22:55
fonte

Leggi altre domande sui tag