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