2016-07-26 9 views
1

Ich habe eine Anwendung, die verschlüsselte Daten verarbeitet und ich habe versucht, so vorsichtig wie möglich, um die Schlüssel unzugänglich machen, aber natürlich muss die Anwendung sie irgendwie kennen.Protect Speicher (Speichern von Schlüsseln) in VB.NET

Ich habe die Schlüssel als Funktionsrückgabewerte fest programmiert, so dass sie nie zu lange im Speicher herumhängen sollten, aber ich denke, es ist immer noch möglich, dass sie gelesen werden. Gibt es eine Möglichkeit, eine Speicherregion unzugänglich zu machen? Ich bin kein Informatiker, also Entschuldigung, wenn das ein bekanntes Problem ist (ich vermute es ist).

sie von einem Decompiler zu schützen, ist eine Frage für einen anderen Tag ...

Vielen Dank im Voraus!

+0

hey Kumpel, Willkommen zu Stack-Überlauf, hier ist ein Thread, den ich gefunden habe, dass Sie nützlich finden können, http://StackOverflow.com/Questions/23513831/hash-with-md5-in-Vb-net – Werdna

Antwort

1

Der Weg dazu ist eine SecureString zu verwenden. Es ist ein bisschen schwieriger zu benutzen als eine normale Zeichenfolge, aber es ist genau das, was Sie für dieses Szenario brauchen. Hier

ist die Dokumentation zu ihm: https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx

und einige weitere Informationen hier darüber: Is SecureString ever practical in a C# application?

Hier ist ein Beispiel dieser der Einrichtung eines ‚String-Wert‘ verwenden

 var s = new System.Security.SecureString();   
     s.AppendChar('s'); 
     s.AppendChar('e'); 
     s.AppendChar('c'); 
     s.AppendChar('r'); 
     s.AppendChar('e'); 
     s.AppendChar('t'); 
     s.AppendChar('s'); 
     s.AppendChar('q'); 
     s.AppendChar('u'); 
     s.AppendChar('i'); 
     s.AppendChar('r'); 
     s.AppendChar('r'); 
     s.AppendChar('e'); 
     s.AppendChar('l'); 
     s.MakeReadOnly(); 
+1

Sie können Codieren Sie keinen SecureString, und es ist für Strings vorgesehen (wenn überhaupt). DPAPI ist viel anwendbarer für einen Schlüssel (binäre Daten), kann aber immer noch nicht (sinnvoll) fest codiert sein. Und Speicherschutzschemata sind sehr sicherheitstechnisch sehr schwach. – bartonjs

0

Edit: Ein Fall hinzugefügt, in dem ein HSM nicht unbedingt die Lösung ist

A s Sie erwähnt, ein Decompiler kann auf Ihre Schlüssel bekommen; das ist ein Teil des Grundes, dass Sie NIEMALS einen Entschlüsselungsschlüssel hart-codiert haben sollten (ein hart-kodierter öffentlicher Schlüssel zum Verschlüsseln ist weniger schlecht).

Wenn ich die Frage nicht verstanden und Ihr Schlüssel ist nicht hart-codiert, aber Sie versuchen, den Schlüssel zu verbergen, wenn es nicht benötigt wird, dann eine API wie ProtectedData.Protect kann, was Sie suchen.

Aber je nachdem, was du machst, ist das vielleicht nicht die richtige Antwort (wer ist dein Angreifer? Wovor verteidigst du?).

Verteidigung aus:

  • A Watson-Dump, die an Microsoft gesendet wird den Schlüssel
    • ProtectedData.Protect enthalten (oder HSM)
  • Ein willkürlicher-Speicher-Lese Sicherheitslücke in Ihrem Code von einem Remote-Angreifer ausgenutzt
    • Protect edData.Schützen (oder die sarkastisch „nicht schreiben, diese Art von Schwachstelle“, oder HSM)
  • Ein Administrator (echt oder aus anderen Gründen) in der Lage, einen Debugger zu befestigen und dem Schlüssel
    • Bewegen Sie den Schlüssel lesen zu einer Hardware-Sicherheitsmodul (HSM)
  • Ihr Prozess
    • HSM
    • ausgelagert und von einem Administrator aus der Auslagerungsdatei ist in der Lage zu lesen
  • Eine willkürliche-execute Sicherheitslücke im Code
    • HSM
  • Ihr System hibernating und Überwinterungs Nutzlast von jemandem gelesen werden, die Ihre Festplatte stiehlt von einem entfernten Angreifer ausgenutzt werden
    • BitLocker oder HSM
  • Verfahren Absturz du mp, die noch auf der Festplatte und der Antrieb
    • BitLocker oder HSM
  • gestohlen wird
  • Der gesamte Computer
    • BitLocker physisch gestohlen wird (aber nicht unbedingt ein HSM, würde, da diese haben wurde auch gestohlen).

Sie werden bemerken, dass die Liste der Dinge, die Sie gegen tatsächlich verteidigen kann mit Speicherschutz klein ist. Viel besser ist es, es so zu machen, dass nichts mehr den Schlüssel lesen kann, indem man es zu einem HSM bewegt. Windows CNG unterstützt symmetrische Verschlüsselung über ein HSM, und .NET 4.6.2 (derzeit in der Vorschau) unterstützt die Verwendung dieses Verhaltens mit the AesCng(string, CngProvider) constructor.

+0

Der "NIEMALS einen fest codierten Entschlüsselungsschlüssel" wird später durch: "Wer ist dein Angreifer" angegeben. "NIE" ist ein bisschen hart, die Information kann trivial sein (wo ist die Bier-Bash), der Angreifer könnte ein durchschnittlicher neugieriger Teenager sein. Es ist nicht trivial, die Datei zu zerlegen und sie ist eine professionelle Sicherheitsperson. In einigen Fällen ist die Datei verschlüsselt und die Entschlüsselung ist sogar nicht direkt möglich, nur das Debuggen von Aktivitäten mit dem Gerätepasscode und einem gerooteten Gerät. Schließlich ist kein Schema 100% sicher. – zaph

+0

Für das HSM ist das eine großartige Lösung, aber es gibt Vorbehalte: man muss Zugriff auf den Server haben, um einen zu installieren, typische HSMs beginnen um $ 10K, im Allgemeinen wird der Schlüssel immer noch im RAM sein, wenn er benutzt wird. – zaph

+0

@zaph True, "nie" ist möglicherweise nicht anwendbar, aber es gibt eine Frage von "wenn Sie sich nicht darum kümmern, dass jemand diesen Schlüssel brach, warum wurde er verschlüsselt?". Was das HSM betrifft, war der Punkt, dass ein geeignetes Bedrohungsmodell bestimmt werden muss, und ein HSM löst viele (aber nicht alle) Bedrohungen (und nicht immer die einfachsten/billigsten).Aber ein richtiges HSM würde eine Verschlüsselung/Entschlüsselung auf dem Chip durchführen, so dass der Schlüssel nicht im RAM des Hauptcomputers sein sollte (weshalb er effektiv ist). – bartonjs