2016-09-12 8 views
6

Ich mache ein Sicherheitsprogramm und ich möchte sicher sein, dass ich das richtig mache. Wenn sich jemand mit einem Passwort anmeldet, wird ein geheimer Schlüssel entschlüsselt und in einer Variablen gespeichert. Wenn sie sich abmelden, möchte ich, dass die Daten im Speicher für diesen geheimen Schlüssel vollständig gelöscht und nicht nur als gelöscht markiert werden. Ich mache zur Zeit folgendes:C# Variable sicher aus dem Speicher löschen

public void Logout() 
{ 
    RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); 
    for (var i = 0; i < 3; i++) 
    { 
     byte[] data = new byte[(int) Math.Round((double) (_phraseHash.Count()))]; 
     rngCsp.GetBytes(data); 
     int randomNum = BitConverter.ToInt32(data, 0); 
     _phraseHash = randomNum.ToString(); 
    } 
    LoggedIn = false; 
    _phraseHash = null; 
} 

Was ich wissen möchte, ist, ob dies ausreichen wird, um vollständig den geheimen Schlüssel (_phraseHash) aus dem System zu löschen.

Ist das auch nötig? Ich weiß eigentlich nicht viel darüber, wie Daten im Speicher gelöscht werden, ich nahm nur an, dass es etwas ähnlich wie Festplatten funktionieren würde, wo Bytes gerade markiert gelöscht und neu geschrieben werden, wenn etwas anderes den Platz benötigt.

+5

Warum verwenden Sie nicht [SecureString] (https://msdn.microsoft.com/en-us/library/system.security.securestring (v = vs.110) .aspx), um Kennwort zu speichern? – 3615

+0

Normalerweise ist das bewährte Verfahren zum Zerstören von Daten das abwechselnde 5-malige Überschreiben von Daten mit allen 0's und dann allen 1's. – jdweng

+0

Einstellung Wert auf Null wird nicht wirklich helfen, weil Daten noch im Speicher sein werden, der Zeiger wird nur nicht mehr darauf zeigen. Wenn Sie den Speicher löschen möchten, sollten Sie ihn lieber einige Male mit zufälligen Daten überschreiben und dann den Garbage Collector zum Handeln zwingen ('GC.Collect()') - der GC reagiert nicht sofort, nachdem der Wert auf null gesetzt wurde. –

Antwort

8

ich glaube, Sie vielleicht interessieren SecureString

Eine Instanz der Klasse System.String ist sowohl unveränderlich und, wenn sie nicht mehr benötigt wird, kann nicht programmatisch für die Garbage Collection geplant werden; Das heißt, die Instanz ist nach dem Erstellen schreibgeschützt, und es ist nicht möglich, vorherzusagen, wann die Instanz aus dem Computerspeicher gelöscht wird. Da System.String-Instanzen unveränderlich sind, erstellen Vorgänge, die eine vorhandene Instanz zu ändern scheinen, tatsächlich eine Kopie davon, um sie zu bearbeiten. Wenn ein String-Objekt vertrauliche Informationen wie ein Kennwort, eine Kreditkartennummer oder persönliche Daten enthält, besteht daher die Gefahr, dass die Informationen nach der Verwendung angezeigt werden, da Ihre Anwendung die Daten nicht aus dem Computerspeicher löschen kann.

Ein SecureString-Objekt ähnelt einem String-Objekt, da es einen Textwert hat. Der Wert eines SecureString-Objekts wird jedoch im Speicher fixiert, kann einen Schutzmechanismus wie die Verschlüsselung verwenden, vorausgesetzt, vom zugrunde liegenden Betriebssystem, kann geändert werden, bis Ihre Anwendung es als schreibgeschützt markiert und gelöscht werden kann von Computer Speicher entweder von Ihrer Anwendung Aufruf der Dispose-Methode oder von der .NET Framework-Garbage-Collector.

+2

Das ist auch eine interessante Lektüre: [Wie sicher ist SecureString?] (Https://msdn.microsoft.com/en-us/library/system.security.securestring%28v=vs.110%29.aspx?f = 255 & MSPPError = -2147217396 # HowSecure) – TaW

+0

Danke euch beiden, ich denke das beantwortet meine Frage. Ich werde es als solches markieren, sobald ich es erfolgreich umgesetzt habe. – Hephaestious

+0

Ok, also habe ich versucht, SecureString zu verwenden, aber es ist nicht kompatibel mit Zeichenfolge, so dass ich jeden String in meiner Verschlüsselungsklasse ersetzen und Unterstützung für securestring -> Byte-Array hinzufügen müsste, um es zu verwenden. Irgendwelche Ideen? – Hephaestious

Verwandte Themen