2009-08-07 13 views
18

Czytałem o Key Containers in .NET jako bezpieczne miejsce do przechowywania klucza prywatnego do asymetrycznej kryptografii i podpisu cyfrowego.Pojemniki na klucze, wystarczająco bezpieczne, aby przechowywać klucze prywatne?

Moje pytanie brzmi, jak bezpieczny jest kontener klucza? bo znalazłem się, czy znam klucza nazwę kontenera, wtedy będę w stanie odzyskać klucz prywatny przy użyciu następujących:

// 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)); 

są kluczowymi Pojemniki bezpieczne miejsce do przechowywania kluczy prywatnych?

Odpowiedz

15

To naprawdę zależy od Twoich wymagań.

Magazyn kluczy za RSACryptoServiceProvider to tak naprawdę magazyn kluczy CryptoAPI. Klucze przechowywane są w systemie plików chronionym przy użyciu poświadczeń użytkownika (jeśli jest używany magazyn użytkowników) lub poświadczeń komputera (jeśli używany jest magazyn maszynowy). Oznacza to, że osoba atakująca, która ma dostęp do odpowiednich poświadczeń, będzie mogła wyodrębnić klucz prywatny.

To będzie prawdziwa dla wszystkich implementacjach kryptograficznych, które nie przechowują klucz w karty elektronicznej, sprzętowego modułu kryptograficznego, układ TPM itp

zabezpieczyć przed mniej zdolnym napastnikiem, CryptoAPI i stąd RSACryptoServiceProvider daje Ci możliwość ustawienia klucza na niezbywalne. Oznacza to, że CryptoAPI/.NET odmówi wykonania eksportu klucza prywatnego (ale kompetentny atakujący nadal będzie mógł obejść ten problem). Aby to zrobić, wygeneruj klucz za pomocą CspProviderFlags.UseNonExportableKey.

Można również użyć CspProviderFlags.UseUserProtectedKey, która poprosi użytkownika o potwierdzenie i opcjonalne dodatkowe hasło, gdy tylko zostanie użyty klucz prywatny.