Come memorizzare IV e chiave temporaneamente ma in modo sicuro

5

Sto usando .NET 4.0 per sviluppare un servizio Windows che memorizzerà temporaneamente dati crittografati in un database. I dati verranno crittografati quando vengono inseriti, quindi decrittografati, elaborati e cancellati una volta elaborati. Questo verrà probabilmente eseguito come un processo batch (migliaia di righe alla volta).

Ho esaminato Generazione di chiavi per la crittografia e la decrittografia su MSDN e sembra che potrei usare la crittografia simmetrica TripleDES (stavo pensando di usare la classe RijndaelManaged).

Tuttavia, se il servizio fallisce o perdo la connessione al mio database mentre sto crittografando e inserendo i dati, voglio essere in grado di riprendere da dove ho lasciato con la stessa IV e chiave.

Come dovrei conservare il mio IV e la chiave su un computer locale? Voglio essere sicuro che non verrà trovato e utilizzato per decifrare i contenuti crittografati del database.

    
posta Husein Roncevic 23.02.2012 - 14:52
fonte

2 risposte

17

Almeno una cosa che puoi migliorare piuttosto facilmente: puoi semplicemente memorizzare l'IV nel database accanto ai dati crittografati. L'IV stesso è non dovrebbe essere segreto . Solitamente funziona come un sale, per evitare una situazione in cui due record in chiaro identici vengono crittografati in un testo cifrato identico. Memorizzare l'IV nel database per ogni riga eliminerà la preoccupazione per la perdita di questi dati. Idealmente, ogni riga IV sarebbe unica e casuale ma non segreta.

Questo lascia il tuo problema per archiviare un'informazione relativamente piccola: la chiave . Non ci dovrebbero essere problemi usando la stessa chiave per tutti i record in termini di sicurezza. Finché la chiave stessa è strong, l'uso di una chiave diversa non ti dà alcun vantaggio (in realtà, sarà un vero mal di testa da gestire), quindi una chiave dovrebbe di solito essere abbastanza buona.

Ci sono probabilmente molte soluzioni per archiviare le chiavi in modo sicuro, ma quelle dipendono dal livello di sicurezza di cui hai veramente bisogno. Per ambiente .NET / Microsoft, suppongo che tu debba guardare DPAPI , sebbene possa esserci migliori opzioni là fuori In un estremo, avresti bisogno di un HSM o di una smartcard, ma in ambienti meno rigorosi che memorizzano la chiave sul filesystem con le giuste autorizzazioni potrebbe essere sufficiente. Tutto dipende dal tuo profilo di rischio e dalle tue minacce.

    
risposta data 23.02.2012 - 16:10
fonte
8

Se comprendo correttamente la tua situazione:

  1. L'IV deve essere memorizzato nel database, insieme ai dati crittografati (concatenati nello stesso campo o in un campo separato nella stessa riga). Questo può essere memorizzato come testo in chiaro, non c'è alcun valore nella sua segretezza.
  2. La chiave di crittografia deve essere archiviata in qualsiasi file o chiave di registro, a condizione che non sia accessibile da remoto, con due limitazioni: ACL strong, limitando l'accesso a questo file solo dall'applicazione (e dagli amministratori); dovrebbe esso stesso essere crittografato prima di salvare.

Per quanto riguarda l'ultimo punto, tieni presente che la chiave di crittografia KEK (chiave di crittografia chiave) deve ancora essere protetta ... Per questo, DPAPI (Data Protection API) è ideale nella maggior parte delle situazioni (anche se in alcuni potresti voler considerare qualche forma di modulo hardware), probabilmente in USER_MODE.
.NET ti offre un facile accesso tramite le classi ProtectedMemory e ProtectedData .

    
risposta data 23.02.2012 - 16:17
fonte

Leggi altre domande sui tag