C # .Net il modo più sicuro per archiviare la coppia di chiavi RSA in Windows

0

Al momento sto cercando il modo più sicuro per memorizzare una chiave RSA privata su Windows.

Rendendolo il più possibile utilizzabile dall'utente finale, mantenendo la sicurezza al massimo. Poiché questo è praticamente impossibile, non sono sicuro di dove andare esattamente con un compromesso. Forse mi sto dimenticando di un'altra possibilità e vorrei chiedere aiuto al consiglio per la sicurezza delle informazioni.

Scenario: un utente genera una coppia di chiavi RSA. Viene spesso utilizzato per crittografare / decrittografare le chiavi AES per accedere ai dati effettivi. Diciamo che è un'applicazione di chat o un'applicazione come dropbox per i file. Lo scopo non ha molta importanza poiché l'attenzione si concentra sul modo in cui la chiave privata RSA è memorizzata e accessibile.

Il flusso di lavoro dell'utente: Accedi a Windows - > Avvia app - > Accedi tramite API al server web - > login riuscito - > accedi a chiave privata localmente - > esegui attività x (chat, file, ecc ...)

Le possibilità:

  1. Database SQLite in cui la chiave privata non è crittografata in formato PEM. Il DB è "crittografato" e la password viene salvata nell'applicazione .net come stringa Veloce e sporco. Direi cattive pratiche. Tuttavia, altre applicazioni non possono accedere al database SQLite poiché non conoscono la chiave.

  2. CryptoAPI .NET che utilizza il contenitore chiave utente RSA. Con DenyExport e altri flag attivi, qualsiasi app può accedere alla chiave mentre l'utente è connesso. Con mimikatz e software simile è facile esportare la chiave privata anche se non è esportabile.

  3. .NET DAPI non è in realtà per proteggere RSA Keypair e più interessante per le informazioni sensibili in memoria. Nessun punto

  4. Esportare semplicemente la chiave PEM come chiave protetta da password. L'usabilità diminuisce in quanto l'utente avrebbe bisogno di una seconda password per accedere alla chiave.

  5. Dati .NET isolati - fuori questione.

C'è un altro modo per memorizzare una chiave privata in modo sicuro ma pratico su un sistema Windows?

    
posta Richard 02.06.2016 - 01:59
fonte

2 risposte

0

Se la tua app in esecuzione come l'utente può accedere a una porzione di dati, anche qualsiasi processo in esecuzione come tale utente può accedervi. Come hai visto nella tua indagine sull'opzione 2, determinati programmi saranno in grado di trovare i dati se sono memorizzati senza crittografia aggiuntiva. Se implementi della crittografia, come nell'opzione 1, qualcuno potrebbe decodificare la tua applicazione per capire come funziona la crittografia, e quindi la loro app, se eseguita come tale, può ottenere la chiave.

L'unico modo per fermare un programma in esecuzione mentre l'utente accede alla coppia di chiavi è non lasciare che il programma sia in grado di decrittografarlo da solo. Vale a dire, è necessario memorizzare la chiave offline (come su un'unità flash che l'utente inserisce quando necessario) o crittografarla con una password che l'utente digita ogni volta (ovvero, la password non viene mai memorizzata). In questo modo, anche se un altro programma ruba i dati protetti, non può ottenere la chiave.

Comunque sia, un attaccante sofisticato creerebbe un programma che aspetta che la chiave venga caricata in memoria e poi la ruba. In Windows, le applicazioni non sono entità di sicurezza. Se l'utente può ottenere dati, le applicazioni in esecuzione come quell'utente possono ottenerlo anche.

    
risposta data 02.06.2016 - 02:55
fonte
1

Il modo più sicuro per memorizzare una chiave privata è di generarlo su una smart card o in un HSM. È un'opzione?

La smart card o HSM può ancora essere utilizzata per crittografare e decifrare da chiunque abbia accesso, ma non rinuncerà alla chiave.

Puoi mettere la chiave pubblica dove vuoi.

    
risposta data 02.06.2016 - 07:56
fonte

Leggi altre domande sui tag