2009-08-07 9 views
18

Ich habe über Key Containers in .NET als sicheren Ort gelesen, um einen privaten Schlüssel für asymmetrische Kryptographie und digitale Signatur zu speichern.Key Containers, sicher genug, um private Schlüssel zu speichern?

Meine Frage ist, wie sicher ist der Schlüsselbehälter? weil ich herausgefunden habe, wenn ich die Schlüsselcontainernamen kenne, dann kann ich mit dem privaten Schlüssel der folgenden abzurufen:

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

Sind Key Container ein sicherer Ort zu speichern private Schlüssel?

Antwort

15

Das hängt wirklich von Ihren Anforderungen ab.

Der Schlüsselspeicher hinter RSACryptoServiceProvider ist wirklich der CryptoAPI-Schlüsselspeicher. Schlüssel werden hier im Dateisystem gespeichert, das unter den Benutzeranmeldeinformationen (bei Verwendung des Benutzerspeichers) oder den Computeranmeldeinformationen (bei Verwendung des Computerspeichers) geschützt ist. Dies bedeutet, dass ein Angreifer, der Zugriff auf die richtigen Anmeldeinformationen hat, den privaten Schlüssel extrahieren kann.

Dies wird für alle Krypto-Implementierungen wahr sein, dass der Schlüssel in einer Smartcard, Hardware-Sicherheitsmodul nicht speichern kann, TPM-Chip usw.

Zum Schutz gegen einen weniger in der Lage Angreifer, der Crypto-API und damit Ihnen RSACryptoServiceProvider gibt die Möglichkeit, den Schlüssel auf nicht exportierbar zu setzen. Dies bedeutet, dass CryptoAPI/.NET es ablehnt, den Export des privaten Schlüssels für Sie durchzuführen (aber ein sachkundiger Angreifer kann dies weiterhin umgehen). Generieren Sie dazu den Schlüssel mit CspProviderFlags.UseNonExportableKey.

Sie können auch CspProviderFlags.UseUserProtectedKey verwenden, die den Benutzer zur Bestätigung auffordert und ein optionales zusätzliches Passwort, wenn der private Schlüssel verwendet wird.

Verwandte Themen