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“?
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
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
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