2008-09-30 9 views
15

Ich muss verschlüsselte Daten (einige kleine Strings) zwischen den Anwendungen läuft. Ich möchte nicht, dass der Benutzer jedes Mal, wenn er die Anwendung startet, eine Passphrase bereitstellt. I.e. Schließlich geht es darum, den/die Verschlüsselungsschlüssel sicher zu speichern.Persistente Speicherung von verschlüsselten Daten mit. NET

Ich war auf der Suche in RSACryptoServiceProvider und mit PersistentKeyInCsp, aber ich bin nicht sicher, wie es funktioniert. Ist der Schlüsselcontainer zwischen Anwendungsläufen oder Neustarts von Maschinen persistent? Wenn ja, ist es benutzerspezifisch oder maschinenspezifisch. I.e. Wenn ich meine verschlüsselten Daten im Roaming-Profil des Benutzers speichere, kann ich die Daten entschlüsseln, wenn sich der Benutzer auf einem anderen Computer anmeldet?

Wenn die oben nicht funktioniert, was sind meine Optionen (Ich brauche mit Roaming-Profile beschäftigen).

Antwort

35

Die Data Protection API (DPAPI) erfüllt genau Ihre Anforderungen. Es bietet eine symmetrische Verschlüsselung beliebiger Daten unter Verwendung der Anmeldeinformationen der Maschine oder (besser) des Benutzers als Verschlüsselungsschlüssel. Sie müssen sich nicht darum kümmern, die Schlüssel zu verwalten. Windows kümmert sich darum für Sie. Wenn der Benutzer sein Kennwort ändert, verschlüsselt Windows die Daten mit dem neuen Kennwort des Benutzers neu.

DPAPI wird in NET mit der Klasse System.Security.Cryptography.ProtectedData ausgesetzt:

byte[] plaintextBytes = GetDataToProtect(); 
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser); 

Der zweite Parameter der Protect-Methode ist ein optionaler Entropie-Byte-Array, das als zusätzliche Anwendung verwendet werden kann, -spezifisches "Geheimnis".

So entschlüsseln, verwenden Sie den ProtectedData.Unprotect Aufruf:

byte[] encodedBytes = GetDataToUnprotect(); 
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser); 

DPAPI korrekt mit Roaming Profiles arbeitet (wie here beschrieben), obwohl Sie die verschlüsselten Daten an einem Ort (Netzwerkfreigabe speichern benötigen, IsolatedStorage mit IsolatedStorageScope.Roaming, etc.), auf die Ihre verschiedenen Maschinen zugreifen können.

Weitere Informationen finden Sie in der ProtectedData-Klasse in MSDN. Es gibt ein DPAPI Whitepaper here, mit mehr Informationen, als Sie jemals wollen.

+0

Gerade für die Nachwelt, werden Sie in anderen Code suchen, um zu handhaben es irgendwo mehr „public“ (zumindest im Intranet zum Beispiel) persistierende, so dass sie, um es aus andere Maschinen. Normalerweise können Sie Environment.SpecialFolder.ApplicationData verwenden, um einen maschinen- und benutzerspezifischen Speicherort zu ermitteln. –

+0

Danke für die Antwort, das sollte funktionieren. Hast du eine Idee, wie das in 1.1 gemacht werden kann? ProtectedData ist neu für .Net 2.0 –

+1

Um DPAPI in .NET 1.1 verwenden zu können, müssen Sie P/Invoke verwenden.Sehen Sie hier für eine ziemlich vollständige Durchlauf: http://msdn.microsoft.com/en-us/library/aa302402.aspx –

0

Ich möchte den DPAPI-Ansatz hinzufügen.

Obwohl ich nicht der Benutzer-Store-Ansatz selbst implementiert haben, gibt es Microsoft-Dokumentation für einen Ansatz Benutzer-Speicher, die verschlüsselt und entschlüsselt Daten für einen bestimmten Benutzer.

Ich benutzte die DPAPI mit Maschinenspeicher. Ich werde es beschreiben, falls es zu dem passt, was Sie tun möchten. Ich habe einen Windows-Dienst verwendet, um ein Windows-Benutzerprofil zu laden, und das Kennwort dieses Benutzers wird zum Verschlüsseln von Daten verwendet.

Als Randbemerkung, verwendet DPAPI Triple-DES, die (als AES) etwas schwächer sein kann, aber dann bin ich nicht sicher, welche Art von Schutz, den Sie suchen.

Windows-Datenschutz http://msdn.microsoft.com/en-us/library/ms995355.aspx

Verwandte Themen