2017-02-10 19 views
-1

Ich möchte eine Zeichenfolge aus dem Speicher der .NET-Anwendung entfernen. Nehmen wir an, wir haben eine Entschlüsselungsmethode, die von einer 3rd-Party-lib stammt und einen String zurückgibt. Das ist nicht schlau, aber ich kann nichts dagegen tun.Inhalt von String löschen

String s = SomeComponent.Decrypt("cypherstring") 

Nun möchte ich den Inhalt s in eine SecureString kopieren, mit zu arbeiten. Aber ... wie werde ich s loswerden. Ich weiß, dass der GC es hier sammeln würde, aber wenn ich diese Saite für eine Weile verwenden würde, würde es bleiben. Auch möchte ich mich hier nicht auf den GC verlassen, da dieser sicherheitsrelevant sein könnte - was meinen Code als deterministisch erachtet.

Meine Idee ist so etwas wie das:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    //shred s 
} 

Es ist keine große Sache, die Daten in die Secure zu kopieren, aber wie ich s „zerstören“?

+0

Warum glaubst du, dass das Kopieren sicherer ist? Du hast bereits eine neue Zeichenkette (n) erstellt, in die die Ausgabe kopiert wird ... Und sobald sie nicht wieder im Code verwendet wird, wird sie GC'd erhalten, wenn sie eine lokale Variable ist, wird sie ziemlich schnell GC'd. – EpicKip

+0

Ich nehme an, Sie könnten eine Kombination von 'Marshall.DestroyStructure' und' Marshall.FreeHAlloc' verwenden, um zu tun, was Sie wollen, und Sie könnten sogar nuklear mit 'GC.Collect' gehen, aber ich stimme EpicKip zu, dass es wahrscheinlich nicht notwendig ist, vor allem, wenn es sich um eine lokale Variable handelt. – Abion47

+0

Sie können s mindestens auf einen anderen Wert setzen, wenn Sie nicht möchten, dass die Daten mehr lesbar sind. Selbst wenn es nicht vom GC verarbeitet wird, ist nichts vom ursprünglichen Zeichenfolgeninhalt übrig. – Pedro

Antwort

0

Mit diesem Code:

public static SecureString Convert(ref String s) 
{ 
    //copy content of s into SecureString 
    SecureString secureString; 
    unsafe 
    { 
     fixed (char* charArray = s.ToArray()) 
      secureString = new SecureString(charArray, s.Length); 
    }    
    //shred s 
    s = null; 
    GC.Collect(); 
    return secureString; 
} 

Beachten Sie, dass die Länge, wenn der String nicht maximale Kapazität von Secure überschreitet kann. Die maximale Kapazität von SecureString ist 65536

+2

Dies wird wahrscheinlich nicht funktionieren. Von MSDN: "Verwenden Sie diese Methode, um zu versuchen, Speicher zurückzuholen, auf den nicht zugegriffen werden kann. Die Verwendung dieser Methode garantiert jedoch nicht, dass der gesamte Speicher in der angegebenen Generation abgerufen werden kann, auf den nicht zugegriffen werden kann." – Gordon

+0

Hinzugekommen, wie ich in der anderen Frage erwähnt habe, haben Sie keine Ahnung, wie oft Kopien dieser Zeichenfolge in (derzeit nicht verwendeten) Speicher im Heap gelandet sind, weil es während früherer GCs" verschoben "wurde (Natürlich, wenn wir während GC sagen "bewegt" werden, was wir eigentlich meinen, wird kopiert und Referenzen aktualisiert. Der GC tut (absichtlich) nichts, um den vorherigen Speicherort aufzuräumen) –