Domanda

Quindi sto cercando di archiviare la chiave simmetrica usando DPAPI. Va tutto bene, ma cosa fare con l'entropia? Questa domanda ha risposto qui Davvero non fornisce abbastanza intuizioni. Sembra un pendio scivoloso: potrei usare il negozio di macchine per archiviare l'entropia, ma poi cosa impedisce a qualcuno di arrivare anche a quello? Nota: sto memorizzando la chiave corrente utilizzando l'ambito dell'utente.

Quindi la mia domanda è: qual è il modo migliore per archiviare l'entropia usando dpapi?

È stato utile?

Soluzione

Tutto ciò che memorizzi localmente può essere compromesso. Ma ci sono passaggi che puoi prendere per renderlo più difficile. C'è un documento su Gestione delle password Che potresti prendere in considerazione la possibilità di guardare oltre. Consideri la chiave entropia una password specifica per l'applicazione.

Mi riferirò alla tua entropia come al tuo Chiave, poiché è funzionalmente una chiave aggiuntiva.

Quello che non vuoi fare è archiviare la tua chiave localmente in un formato non crittografato. Invece vuoi crittografare la tua chiave o derivarla da un'altra fonte in ovvio. Naturalmente se crittografi la chiave, è necessario archiviare la chiave utilizzata per crittografarla, ma spesso questo singolo livello di indirezione è sufficiente per scoraggiare la maggior parte degli sfidanti.

Sarebbe il vantaggio di derivare la chiave. Potresti derivarlo come un hash di alcuni altri dati costanti (deve essere qualcosa che non cambia con le revisioni della tua applicazione). Un trucco per derivare un hash è quello di combinare l'hash con qualche altro valore costante (come un GUID o un numero casuale di grande) in modo che qualcun altro non possa semplicemente combinare un algoritmo di hash noto e ottenere la chiave. Questa è un'alternativa molto migliore alla creazione del tuo algoritmo di hash (cosa che non dovresti mai fare, a meno che tu non abbia un dottorato in matematica).

Ad un certo punto avrai bisogno di una sorta di codifica rigida chiave nell'applicazione. Questa chiave è combinata con alcuni altri dati in un hash per creare la chiave entropia o utilizzata per decrittografare il tasto entropia. In realtà puoi avere la modifica chiave con una nuova revisione della tua applicazione, purché mantenga la vecchia chiave per decrittoni la chiave esistente. Quindi puoi rivitarlo con la nuova chiave o metodo.

Se desideri la migliore sicurezza, puoi archiviare il tasto entropia dal computer. Ciò richiederebbe una connessione Internet e un certificato SSL, ma poi la chiave non viene mai persistita da nessuna parte a livello locale per essere scoperta. Per fare ciò è possibile impostare un sistema di risposta alla sfida più robusto in modo che l'autenticazione della richiesta sia diversa ogni volta e la chiave viene consegnata rispetto alla crittografia SSL in modo che non possa essere intercettata. Una volta utilizzata la chiave, viene scartata. Naturalmente questo tipo di sconfigge lo scopo di molti scenari in cui si utilizza DPAPI per l'archiviazione sicura locale.

Qualunque cosa tu faccia, tieni presente che sarà compromesso - ciò accade sempre quando qualcuno ha pieno accesso alla macchina locale e i dati archiviati su di essa. La soluzione a ciò è continuare a rilasciare aggiornamenti che cambiano abbastanza il metodo che la vecchia crepa non funziona più. Ciò renderà la distribuzione di una crepa meno preziosa in quanto sarà difficile trovarne una per la versione giusta.

Altri suggerimenti

Innanzitutto, lasciami rispondere alla domanda sul post originale. Si riduce al fatto che l'entropia deve essere memorizzata sotto l'autorità dell'utente e/o l'autorità dell'applicazione se verrà utilizzata per la conservazione persistente. Suppongo che potresti utilizzare una chiave memorizzata con l'applicazione per crittografare le informazioni nel negozio persistente, ma di nuovo un'applicazione dannosa sarebbe in grado di accedere a questa chiave di crittografia. Quindi, non sento che ci sia un mezzo per proteggere dallo scenario che menzioni nei commenti. Tuttavia, dato quello che hai detto è l'uso previsto dell'entropia, non ritengo che aiuti a risolvere il tuo problema.

Sembra che il problema effettivo sia stabilire un canale sicuro di comunicazione tra l'applicazione client e il server. Nel tuo design, stai scambiando chiavi che verranno utilizzate per crittografare la comunicazione. Penso che il tentativo di utilizzare il codice personalizzato per risolvere questo problema porterà a ulteriori vulnerabilità di sicurezza.

Dato tutto ciò, suggerirei di creare un servizio WCF (Windows Communication Foundation) utilizzato per recuperare informazioni sensibili. Potrebbe ovviamente essere usato per recuperare tutte le informazioni, ma il minor cambiamento sarebbe quello di limitare il servizio a informazioni sensibili.

Con WCF, è possibile configurare sia il client che il server per utilizzare un canale sicuro. WCF ha molte opzioni per stabilire un canale sicuro di comunicazione sul server.

<wsHttpBinding>
    <binding>
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
        </security>
    </binding>
</wsHttpBinding>

Una volta che hai un canale sicuro, molti degli altri problemi sono più semplici come l'accesso ai dati CC. Se tali dati vengono inviati un canale sicuro, diventa un problema di autorizzazione anziché di sicurezza del canale.

Vedere Come: creare una sessione sicura per più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top