2009-04-06 16 views
57

Ho un'applicazione Web che utilizza un algoritmo di crittografia simmetrica.Memorizzazione delle chiavi di crittografia - best practice?

Come memorizzereste la chiave segreta e il vettore di inizializzazione? Memorizzare come letterale nel codice sembra una cattiva idea. Che ne dici delle impostazioni delle app? Qual è la migliore pratica qui?

+2

Questa non è una domanda banale. Potrebbe essere utile rivedere questo abstract da diversi esperti di sicurezza per mettere questa domanda in prospettiva: http://www.schneier.com/paper-key-escrow.html –

risposta

52

Un approccio standard nel mondo webapp è quello di dividere la chiave e metterla in luoghi diversi. Ad esempio, è possibile suddividere la chiave e inserirne una parte nel filesystem (al di fuori della directory 'webapps'), parte di essa nella configurazione JNDI (o equivalente .net) e parte di essa nel database. Ottenere qualsiasi singolo pezzo non è particolarmente difficile se sei compromesso, ad es. Esaminare supporti di backup o SQL injection, ma ottenere tutti i pezzi richiederà molto più lavoro.

È possibile dividere un tasto XOR-it con numeri casuali della stessa dimensione. (Utilizzare un generatore di numeri casuali crittograficamente forte!) È possibile ripetere questo processo più volte se si desidera dividere la chiave in più parti. Alla fine del processo, ad esempio, tre chiavi parziali come p1^p2^p3 = chiave. Potrebbe essere necessario codificare in base64 alcune chiavi parziali in modo che possano essere archiviate correttamente, ad es. In una proprietà JNDI.

(Esistono modi più sofisticati per dividere un tasto, ad esempio un algoritmo n-of-m in cui non è necessario ricorrere a tutti i pezzi per ricreare la chiave, ma questo è ben oltre ciò che è necessario qui.)

Se è possibile richiedere all'utente di immettere attivamente la password, esistono algoritmi PBE (crittografia basata su password) che convertono una password in una buona chiave simmetrica. Vuoi trovarne uno che richieda anche un file esterno. Anche in questo caso, i backup su nastro o la password stessa non sono sufficienti, ne occorrono entrambi. Puoi anche usare questo per dividere la password in due parti con JNDI: puoi usare una passphrase in chiaro in JNDI e un file di inizializzazione da qualche parte nel filesystem.

Infine, qualunque cosa tu sia, puoi tranquillamente "reimpostare" la tua applicazione. Un approccio consiste nell'utilizzare la password ottenuta in precedenza per decrittografare un altro file che contiene la chiave di crittografia effettiva. Ciò semplifica la modifica della password se ritieni che sia stata compromessa senza richiedere un'enorme ricodifica di tutti i dati, semplicemente ricodificando la tua chiave effettiva.

4

bastone nel web.config e encrypt that section

This SO question parla più sulla crittografia web.config

+9

se si cripta il web.config, dove hai intenzione di archiviare hanno la chiave per decifrare il web.config? – Kirby

+24

Si tratta di tartarughe fino in fondo ... – mwolfe02

10

E 'possibile per l'inserimento di una password in modo interattivo ogni volta che l'applicazione si avvia? In questo modo non è necessario memorizzare la chiave, o almeno qualsiasi chiave (che sia simmetrica o privata) può essere crittografata con questa password di "bootstrap".

In caso contrario, memorizzare la chiave segreta in un file e modificarne le autorizzazioni per renderla accessibile solo all'utente che esegue l'applicazione Web.

Questi approcci sono indipendenti dalla piattaforma. Per suggerimenti più concreti, le informazioni sulla tua piattaforma sarebbero utili.

A proposito, è necessario utilizzare un vettore di inizializzazione per un solo messaggio. E le IV non sono state tenute segrete, quindi è possibile memorizzarle ovunque, ma memorizzarle con l'unico messaggio che la usa è consuetudine.

+0

@BC Ecco una RFC su crittografia basata su password che potrebbe essere interessante, ma sono un po 'di leggere lettura: http://www.ietf.org/rfc/rfc2898.txt @erickson LOL hai la tua chiave pubblica nel tuo blocco di me. – AaronLS

+0

Su una nota non tecnica ... per rendere ancora più sicura la password inserita in modo interattivo dovrebbe essere scelta o distribuita a due (o più) persone o luoghi fisici. Ciò significa che nessuno conosce la password. Questo è utile in situazioni in cui si pensi che l'ingegneria sociale/corruzione/corruzione è una considerazione. – Andrew

2

Questo dovrebbe aiutare ...

http://msdn.microsoft.com/en-us/library/ms998280.aspx

Ma, si dovrebbe prendere in considerazione di andare a PKI se si è sul serio la protezione dei dati.

+1

Quando si utilizza PKI, come e dove si memorizza la chiave privata? – Dan

+3

Esattamente! Hai ancora un problema di archiviazione della chiave se utilizzi la crittografia PKI o della chiave simmetrica. Quindi PKI non lo rende una soluzione migliore quando lo stesso sistema o parte ha bisogno di crittografare e decrittografare i dati. – swbandit

5

Ho utilizzato un approccio in cui la mia applicazione richiede una chiave simmetrica quando viene avviata e la cerca in un determinato file. Una volta avviata l'applicazione, rimuovo il file. Una copia del file viene mantenuta in remoto per eventuali riavvii necessari. Ovviamente questo approccio non è fattibile se l'applciazione ha frequenti riavvii.

Un'altra alternativa sarebbe un gestore di certificati come Windows Certificate Store. È in grado di memorizzare i certificati e le loro chiavi in ​​modo sicuro ed è anche possibile contrassegnare le chiavi private come non esportabili in modo che sia necessario un serio hacking per ottenere la chiave. La tua applicazione potrebbe caricare il suo certificato dall'Archivio certificati ed essere in grado di chiamare operazioni per firmare richieste o generare nuove chiavi simmetriche. Inoltre, è possibile assegnare le autorizzazioni a diversi archivi certificati in modo che solo determinati account con privilegi possano accedere al certificato.

+0

"Tenuto in remoto" dove? Potresti spiegare perché questo rende il sistema più sicuro? – Dan

+0

"Una copia del file viene mantenuta in remoto per eventuali riavvii necessari" Potete approfondire questo argomento? –

Problemi correlati