Ich habe ein C# -Byte [], das vertrauliche Daten enthält. Was ist der beste Weg, um es zu löschen? Wie stelle ich sicher, dass etwas wie Array.Clear nicht weg optimiert wird?Löschen eines C# -Byte-Arrays mit vertraulichen Daten
Antwort
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 einString
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
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);
}
}
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.
Sie haben das getan. Dieser Angriff setzt jedoch den Zugriff auf das physische System voraus. Defense in depth ... – Spence
Die wahre Lektion ist, dass Sie keine Geheimnisse auf Ihren Client legen, da Ihr Client immer kompromittiert werden kann. – Spence
@Spence: Ja, ich denke nur, dass es verrückt ist, dass sie das tun können. :) –
AFAIK gibt es keine Entsprechung zu SecureZeroMemory in CLR. Sie sollten SecureString verwenden, um Ihre Daten zu speichern.
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.
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.
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!) :)
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. –
@JirkaHanika Einverstanden. – TrueWill
- 1. Korrekte Python-Methode zum Löschen eines Bytearrays
- 2. Teilen eines Bytearrays
- 3. Weitergabe eines Bytearrays aus Unity C# in eine C++ - Bibliotheksmethode
- 4. Rückgabe eines Bytearrays von ActiveX an Javascript
- 5. Schnelle Bitverschiebung eines Bytearrays - CMAC-Unterschlüssel
- 6. Löschen eines Char-Arrays c
- 7. Ändern eines Spaltentyps mit Daten, ohne die Daten zu löschen
- 8. Gibt es Gesetze bei der Arbeit mit vertraulichen Finanzdaten?
- 9. Löschen eines Daten meiner Datenbank von AS3
- 10. löschen Sie Daten in Textdatei in C++
- 11. Wie kann man das Löschen von vertraulichen Daten garantieren, bevor es in Java auf Müll gesammelt wird?
- 12. Namenskonvention zum Löschen von Daten in C++
- 13. Löschen der Grafiken eines transparenten Bedienfelds C#
- 14. Löschen Sie einige Daten auf Datensatz C#
- 15. C# Erstellungsmethode zum Löschen eines Registrierungsschlüssels
- 16. Löschen eines Bereichs von Knoten in C++
- 17. C++ Löschen eines Knotens in Queue
- 18. C++ Löschen eines Zeigers auf einen Zeiger
- 19. Löschen eines Briefumschlags mit dem neuen DocuSign C# -Client
- 20. Löschen eines Textfelds mit Javascript
- 21. Löschen eines Dokuments mit Kibana
- 22. Löschen eines Datensatzes (mit GridView)
- 23. Löschen zugehörigen Modell mit glut-Daten
- 24. Löschen eines
- 25. Funktionen zum Vergleichen von 2 Bytearrays
- 26. Bitmaske Operationen auf Scheiben Python ByteArrays
- 27. Wie vertraue ich keine vertraulichen Daten, sondern mache sie für Skripts verfügbar?
- 28. Warum Assert.AreEqual (T obj1, Tobj2) nicht mit identischen Bytearrays
- 29. Warum funktionieren == und .equals in Java nicht mit Bytearrays?
- 30. löschen Inhalt einer Textdatei mit TextWriter C#
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
Zur Geschäftsordnung: Wenn Sie _compiler_ sagen, beziehen Sie sich auf den C# -Compiler oder den JIT-Compiler? –