2009-08-07 17 views
18

Stavo leggendo su Key Containers in .NET come un luogo sicuro dove archiviare una chiave privata per la crittografia asimmetrica e la firma digitale.Contenitori chiave, abbastanza sicuro per memorizzare le chiavi private?

La mia domanda è quanto è sicuro il contenitore chiave? perché ho scoperto che se conosco il nome di contenitore di chiavi, allora sarò in grado di recuperare la chiave privata con la seguente:

// Create the CspParameters object and set the key container 
// name used to store the RSA key pair. 
CspParameters cp = new CspParameters(); 
cp.KeyContainerName = ContainerName; 

// Create a new instance of RSACryptoServiceProvider that accesses 
// the key container MyKeyContainerName. 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 

// Display the key information to the console. 
Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true)); 

sono contenitori chiave un luogo sicuro per memorizzare le chiavi private?

risposta

15

Questo dipende molto dalle vostre esigenze.

Il keystore dietro RSACryptoServiceProvider è in realtà il keystore di CryptoAPI. Le chiavi qui sono memorizzate sul filesystem protetto sotto le credenziali dell'utente (se si utilizza l'archivio utente) o le credenziali della macchina (se si utilizza l'archivio della macchina). Ciò significa che un utente malintenzionato che ha accesso alle credenziali appropriate sarà in grado di estrarre la chiave privata.

Questo sarà vero per tutte le implementazioni di crittografia che non memorizzano la chiave in una smart card, moduli di sicurezza hardware, chip TPM ecc

Per proteggersi da un attaccante meno capace, la CryptoAPI e quindi RSACryptoServiceProvider ti dà la possibilità di impostare la chiave su non esportabile. Ciò significa che CryptoAPI/.NET rifiuterà di eseguire l'esportazione della chiave privata per te (ma un hacker esperto sarà ancora in grado di aggirare questo problema). Per fare ciò, generare la chiave con CspProviderFlags.UseNonExportableKey.

È inoltre possibile utilizzare CspProviderFlags.UseUserProtectedKey che richiede all'utente la conferma e una password aggiuntiva facoltativa ogni volta che si utilizza la chiave privata.

Problemi correlati