it-swarm.com.de

Bester Weg, um Verschlüsselungsschlüssel in .NET C # zu speichern

In unserer Anwendung haben wir viele sensible Konfigurationseinstellungen, die wir in einer erneut verschlüsselten XML-Datei speichern.

Diese sichere Datei muss zur Laufzeit entschlüsselt und die Konfigurationswerte gelesen werden. Es tritt jedoch ein Problem auf, dass der Schlüssel und der Initialisierungsvektor im Code hartcodiert sind und daher von jedem mit Reflector gelesen werden können. 

Was ist der beste Weg, um Verschlüsselungsschlüssel in .NET zu speichern, damit sie mit Reflector nicht gelesen werden können?

58
ganeshran

Wenn Sie Ihre Daten vor anderen Benutzern schützen möchten. Schauen Sie sich die Klasse ProtectedData an.

(Haftungsausschluss: Der Schutz Ihrer Daten zum Erstellen eines Kopierschutzschemas wird in dieser Antwort nicht behandelt.).

Diese Klassen verwenden die DPAPI von Windows, um Daten auf Benutzer- oder Maschinenebene zu ver- und entschlüsseln.

Wenn Sie ProtectedData/DPAPI verwenden, müssen Sie nicht mehr mit Schlüsseln umgehen und die Daten selbst sichern. Sie können die Daten für den aktuellen Benutzer schützen. Die Daten können von verschiedenen Computern von denselben Domänenbenutzern gelesen werden.

Wenn Sie einen eigenen Schlüssel erstellen möchten. Sie können einen Schlüssel pro Benutzer/Computer erstellen und diesen Schlüssel in der Registrierung speichern. Da die Registrierung gesichert werden kann, kann nur der aktuelle Benutzer den Schlüssel zurücklesen. Ich weiß, dass die Registry schlechtes Karma hat, aber tatsächlich ist das Speichern von Daten sehr gut.

PS: Geben Sie die IV nicht in Ihren Code ein. Erstellen Sie jedes Mal eine neue IV und stellen Sie sie vor die Daten.

19
GvS

Wenn Sie sie nicht im Reflektor lesen können, wie können Sie erwarten, dass das Programm sie liest? Sie könnten sie verschleiern, indem Sie sie zerlegen und die Teile überall aufbewahren. Wenn Sie (AFAIK) jedoch einmal benötigen, dass Ihr Programm sie lesen kann, kann jeder, der Zugriff auf Ihren Code hat, sie auch lesen.

Denken Sie daran, dass auch auf Werte im Speicher zugegriffen werden kann ( cough SecureString).

10
Massif

Sie sollten den Maschinenschlüsselspeicher verwenden. Dies ist ein sicherer Speicher speziell für diesen Zweck. Zum Beispiel:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

KEYNAME ist eine benutzerdefinierte Zeichenfolge, mit der der Schlüssel später abgerufen werden kann. 

Weitere Beispiele finden Sie in dieser Frage: So speichern Sie einen öffentlichen Schlüssel in einem RSA-Schlüsselcontainer auf Maschinenebene

8
Muis

Im Allgemeinen sollten für jede Sitzung ein neuer Schlüssel und eine neue IV erstellt werden, und weder der Schlüssel noch die IV sollten zur Verwendung in einer späteren Sitzung gespeichert werden.

Um einen symmetrischen Schlüssel und eine IV mit einer entfernten Partei zu kommunizieren, verschlüsseln Sie normalerweise den symmetrischen Schlüssel und die IV mit asymmetrischer Verschlüsselung. Das Senden dieser Werte über ein unsicheres Netzwerk ohne Verschlüsselung ist äußerst unsicher, da jeder, der diese Werte abfängt, Ihre Daten entschlüsseln kann. Weitere Informationen zu diesem Verfahren zum Verschlüsseln und Übertragen von Schlüssel und IV finden Sie unter Erstellen eines kryptographischen Schemas .

4
apros

Wenn Sie die Anwendung installieren, erstellen Sie einen neuen Satz von RSA-Schlüsseln und verschlüsseln Sie die Daten mit AES unter Verwendung des privaten Schlüssels als Kennwort. Da Windows private RSA-Schlüssel sicher auf dem PC speichert, auf dem sie erstellt wurden, können die Daten nur von dem Computer entschlüsselt werden, der die Daten erstellt hat , da nur dieser Computer dies tut Habe den nötigen Schlüssel.

3
DividedByZero

Wie wäre es, den Dateiverschlüsselungs-/Entschlüsselungsschlüssel auf einem Remote-Server zu speichern und über einen Webdienst zu erhalten, der ihn über https an die Anwendung überträgt? Auf diese Weise bleibt der Schlüssel im Speicher des Computers, aber nicht in einer Quellcodedatei.

Dies setzt jedoch voraus, dass die Verbindung zum Schlüsselserver von demjenigen ausgeführt wird, der die Anwendung ausführt.

1
user1892410

Was ist mit dem Speichern des Schlüssels auf einer Hardware? Können wir es als bewährte Methoden verwenden, um den Schlüssel zu verbergen? Können wir den Schlüssel in der Konfigurationsdatei speichern und dann die Konfigurationsdatei verschlüsseln? In meinem Fall spreche ich von einer eigenständigen .Net-Anwendung.

0
iamjayp