Fühlen Sie sich frei, mich zu korrigieren, wenn meine Annahmen hier falsch sind, aber lassen Sie mich erklären, warum ich frage.
Entnommen aus MSDN, a SecureString
:
Stellt Text dar, der vertraulich behandelt werden sollte. Der Text wird aus Datenschutzgründen verschlüsselt und bei Nichtgebrauch aus dem Computerspeicher gelöscht.
Ich verstehe, es ist absolut sinnvoll, ein Passwort oder andere private Informationen in einem SecureString
über a zu speichern System.String
, weil Sie steuern können, wie und wann es tatsächlich im Speicher gespeichert wird, weil a System.String
:
ist unveränderlich und kann, wenn es nicht mehr benötigt wird, nicht programmgesteuert für die Speicherbereinigung geplant werden. Das heißt, die Instanz ist nach ihrer Erstellung schreibgeschützt und es ist nicht möglich vorherzusagen, wann die Instanz aus dem Computerspeicher gelöscht wird. Wenn ein String-Objekt vertrauliche Informationen wie ein Kennwort, eine Kreditkartennummer oder persönliche Daten enthält, besteht daher das Risiko, dass die Informationen nach ihrer Verwendung angezeigt werden, da Ihre Anwendung die Daten nicht aus dem Computerspeicher löschen kann.
Bei einer GUI-Anwendung (z. B. einem SSH-Client) muss die Anwendung SecureString
jedoch aus a erstellt werden System.String
. Alle Textsteuerelemente verwenden eine Zeichenfolge als zugrunde liegenden Datentyp .
Dies bedeutet, dass jedes Mal, wenn der Benutzer eine Taste drückt, die alte Zeichenfolge verworfen wird und eine neue Zeichenfolge erstellt wird, um den Wert im Textfeld darzustellen, selbst wenn eine Kennwortmaske verwendet wird. Und wir können nicht steuern, wann oder ob einer dieser Werte aus dem Speicher verworfen wird .
Jetzt ist es Zeit, sich beim Server anzumelden. Erraten Sie, was? Sie müssen zur Authentifizierung eine Zeichenfolge über die Verbindung übergeben . Konvertieren wir also unsere SecureString
in eine System.String
.... und jetzt haben wir eine Zeichenfolge auf dem Heap, ohne dass er gezwungen werden kann, die Garbage Collection zu durchlaufen (oder Nullen in den Puffer zu schreiben).
Mein Punkt ist : Egal , was Sie tun, irgendwo entlang der Linie, die SecureString
sich geht in eine umgewandelt werden System.String
, es bedeutet , zumindest gibt es auf dem Heap zu einem bestimmten Zeitpunkt (ohne Gewähr für Garbage Collection).
Mein Punkt ist nicht : ob es Möglichkeiten gibt, das Senden einer Zeichenfolge an eine SSH-Verbindung zu umgehen oder zu umgehen, dass ein Steuerelement eine Zeichenfolge speichert (benutzerdefiniertes Steuerelement erstellen). Für diese Frage können Sie "ssh-Verbindung" durch "Anmeldeformular", "Registrierungsformular", "Zahlungsformular", "Lebensmittel-Sie-würden-Ihren-Welpen-aber-nicht-Ihre-Kinder-Formular füttern" ersetzen. etc.
- Ab wann wird die Verwendung eines
SecureString
tatsächlich praktikabel? - Lohnt es sich jemals die zusätzliche Entwicklungszeit, um die Verwendung eines
System.String
Objekts vollständig zu beseitigen ? - Ist es der springende Punkt
SecureString
, einfach die Zeit zu reduzieren, die sich aSystem.String
auf dem Heap befindet (um das Risiko zu verringern, zu einer physischen Auslagerungsdatei zu wechseln)? - Wenn ein Angreifer hat bereits die Mittel für eine Heap - Prüfung, dann wird er höchstwahrscheinlich entweder (A) hat bereits die Mittel , Tastenanschläge zu lesen, oder (B) , die bereits auf den Rechner hat ... So würde mit einem
SecureString
verhindern , dass er in der Einstiegs- Daten sowieso? - Ist das nur "Sicherheit durch Dunkelheit"?
Tut mir leid, wenn ich die Fragen zu dick stelle, hat mich die Neugier gerade überwältigt. Fühlen Sie sich frei, einige oder alle meiner Fragen zu beantworten (oder mir zu sagen, dass meine Annahmen völlig falsch sind). :) :)
SecureString
keine wirklich sichere Zeichenfolge ist. Dies ist lediglich eine Möglichkeit, das Zeitfenster zu verkürzen, in dem jemand Ihr Gedächtnis überprüfen und die vertraulichen Daten erfolgreich abrufen kann. Dies ist nicht kugelsicher und sollte es auch nicht sein. Aber die Punkte, die Sie ansprechen, sind sehr gültig. Siehe auch