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 .