2009-08-24 3 views

Antwort

9

Ich kann mich an keinen Umständen, in denen ein Aufruf an Array.Clear jemals weg optimiert werden würde, und selbst wenn es könnte, es wäre nur in Fällen wegoptimiert werden, wo Ihre byte[] bereits gelöscht wurde.

Edit: Etwas anderes herauszufinden, zu prüfen wäre, wenn der SecureString Umsetzung des Rahmen in Ihrer Situation nützlich sein würde:

Ein SecureString Objekt ähnelt ein String Objekt, dass es einen Text hat Wert. Allerdings ist der Wert eines Secure Objekt automatisch verschlüsselt ist, kann geändert werden, bis die Anwendung es als schreibgeschützt markiert und kann durch entweder Ihre Anwendung oder das .NET-Framework Garbage Collector aus dem Computerspeicher gelöscht werden

+1

Wenn niemand möglicherweise das Array lesen kann, nachdem es kann gelöscht wurde, dann nicht der optimize Compiler, indem sie es nicht Clearing? – Gautam

+0

Zur Geschäftsordnung: Wenn Sie _compiler_ sagen, beziehen Sie sich auf den C# -Compiler oder den JIT-Compiler? –

1

Wenn Sie über Array.Clear besorgt sind, könnten Sie immer nur Marshal.Kopieren Sie ein leeres Byte-Array auf die vertraulichen Daten.

Zum Beispiel, wie diese (unter der Annahme, ‚Daten‘ ist die byte [], um die sensible Informationen enthält):

 byte[] clear = new byte[data.Length]; 
     unsafe 
     { 
      fixed (byte* ptr = &data[0]) 
      { 
       Marshal.Copy(clear, 0, new IntPtr(ptr), data.Length); 
      } 
     } 
0

Ich habe den Eindruck, dass es bereits Techniken, um den letzten Zustand des RAM zu zeigen waren. Dann sind da noch die MIT-Leute, die ein paar RAMs eingefroren haben, sie aufgehoben und an einen anderen Ort gebracht und den ganzen Staat behalten haben.

Also, wenn Sie paranoid waren, würden Sie zufällig eine ganze Reihe von Daten über Ihr Array ein paar Mal schreiben.

+0

Sie haben das getan. Dieser Angriff setzt jedoch den Zugriff auf das physische System voraus. Defense in depth ... – Spence

+0

Die wahre Lektion ist, dass Sie keine Geheimnisse auf Ihren Client legen, da Ihr Client immer kompromittiert werden kann. – Spence

+0

@Spence: Ja, ich denke nur, dass es verrückt ist, dass sie das tun können. :) –

4

Auch wenn Array.Clear ausgeführt wird (nicht optimiert weg) Ich denke, Sie haben immer noch ein Problem. Der GC kann Objekte im Heap verschieben und es gibt keine Garantie, dass die Spuren des ursprünglichen Bytes verweilen, wenn sie von einem Ort zum anderen verschoben wurden, bevor Array.Clear aufgerufen wurde.

Sie möchten vielleicht SecureString, ProtectedData oder ProtectedMemory auschecken. Aber, wenn Sie einen manuelleren Ansatz wünschen, müssen Sie das Byte-Array zumindest so festlegen, dass der GC es nicht verschieben kann. Ich glaube, der SecureString nutzt diesen Trick ebenfalls.

0

Ein Trick, der mit den meisten C-Compilern funktioniert, ist, etwas wie die Summe aller Elemente des gelöschten Arrays zu summieren, und dann etwas mit dieser Summe zu tun, wie es ausdrucken oder mit dem Rückgabewert. Auf diese Weise eliminiert die Eliminierung von toten Codes nicht das Löschen des Arrays.

Das heißt, sind Sie sicher, dass Sie nur dieses Array löschen müssen? Berücksichtigen Sie alle anderen Stellen, an denen der Wert möglicherweise ebenfalls vorhanden war: ein Puffer in einer Form, String-Objekte, die herumgereicht werden, Schlüsseläquivalenzwerte in Zwischenberechnungen oder Auslagerung auf Datenträger. Wenn Sie dieses eine Array auf Null setzen, bekommen Sie nur 1% des Weges dorthin. Sie müssen den gesamten Schlüsselpfad löschen.

1

Wenn Sie Ihre eigene Verschlüsselungsroutine schreiben, wäre mein Ratschlag: nicht. Sie werden es falsch verstehen (so wie ich, wie jeder, der keine Sicherheit ist Experte). Verwenden Sie eine bekannte, getestete Bibliothek.

(Wenn nicht, egal!) :)

+1

An einem bestimmten Punkt müssen Sie die Bibliothek aufrufen, und Sie müssen wissen, wie Sie mit den Geheimnissen umgehen, die Sie in die Bibliothek hinein und aus ihr herausholen. Andernfalls können Sie keine sichere Software erstellen. –

+0

@JirkaHanika Einverstanden. – TrueWill

Verwandte Themen