Wie konvertiere ich String
zu SecureString
?
Wie konvertiere ich String
zu SecureString
?
Antworten:
Das tust du nicht. Der gesamte Grund für die Verwendung des SecureString-Objekts besteht darin, das Erstellen eines Zeichenfolgenobjekts zu vermeiden (das in den Speicher geladen und dort bis zur Speicherbereinigung im Klartext gespeichert wird). Sie können einem SecureString jedoch Zeichen hinzufügen, indem Sie sie anhängen.
var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
*****
AppendChar
wird erst zur Laufzeit ausgeführt, sodass diese Zeichen immer noch aus der IL gelesen werden können, richtig? Vielleicht hilft auch eine Verschleierung während der Kompilierung, wenn Sie Kennwörter fest codieren.
Es gibt auch eine andere Möglichkeit, zwischen SecureString
und zu konvertieren String
.
1. String zu SecureString
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString to String
string theString = new NetworkCredential("", theSecureString).Password;
Hier ist der Link
SecureString
wenn Ihr Code ein string
Objekt mit dem Wert erstellt, den Sie sichern möchten. Das Ziel von SecureString
besteht darin, zu vermeiden, dass sich die Zeichenfolge im verwalteten Speicher befindet, damit ein Angreifer, der diesen Speicher untersucht, den Wert erkennen kann, den Sie ausblenden möchten. Da der NetworkCredential
Konstruktor Sie eine Zeichenfolge fordern erfordert, die nicht die Art und Weise ist zu gehen ... Sicher, ist der Code eine einfache Möglichkeit , zu und von einem Secure zu konvertieren, aber es macht den Code so sicher wie mit einem einfachen Verwendungstring
SecureString
wenn wir mit einigen Bibliotheken arbeiten. Und seien wir ehrlich, wenn jemand aktiv den Speicher Ihrer Anwendung scannt, haben Sie bereits verloren. Selbst wenn Sie SecureString richtig verwendet haben, was ich noch nie gesehen habe, müssen andere wertvolle Daten extrahiert werden.
Die folgende Methode hilft beim Konvertieren von Zeichenfolgen in sichere Zeichenfolgen
private SecureString ConvertToSecureString(string password)
{
if (password == null)
throw new ArgumentNullException("password");
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
return securePassword;
}
Hier ist ein billiger Linq-Trick.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
Ich werde das da rauswerfen. Warum?
Sie können nicht einfach alle Ihre Zeichenfolgen in sichere Zeichenfolgen ändern, und plötzlich ist Ihre Anwendung "sicher". Die sichere Zeichenfolge dient dazu, die Zeichenfolge so lange wie möglich verschlüsselt und nur für einen sehr kurzen Zeitraum zu entschlüsseln, wodurch der Speicher gelöscht wird, nachdem eine Operation ausgeführt wurde.
Ich würde riskieren zu sagen, dass Sie möglicherweise einige Probleme auf Designebene haben, bevor Sie sich Gedanken über die Sicherung Ihrer Anwendungszeichenfolgen machen. Geben Sie uns weitere Informationen darüber, was Sie versuchen, und wir können Ihnen möglicherweise besser helfen.
Keine ausgefallene Linq, nicht alle Zeichen von Hand hinzufügen, einfach und schlicht:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
Ich möchte nur alle Leute darauf hinweisen, die sagen: "Das ist nicht der Punkt von SecureString
", dass viele der Leute, die diese Frage stellen, sich in einer Bewerbung befinden, in der sie, aus welchem Grund auch immer, gerechtfertigt oder nicht, nicht besonders besorgt sind Eine temporäre Kopie des Kennworts befindet sich als GC-fähige Zeichenfolge auf dem Heap. Sie müssen jedoch eine API verwenden, die nurSecureString
Objekte akzeptiert . Sie haben also eine App, die Sie nicht interessiertUnabhängig davon, ob sich das Kennwort auf dem Heap befindet, ist es möglicherweise nur für den internen Gebrauch bestimmt und das Kennwort ist nur vorhanden, da es von den zugrunde liegenden Netzwerkprotokollen benötigt wird. Sie können feststellen, dass diese Zeichenfolge, in der das Kennwort gespeichert ist, nicht zum Einrichten einer Remote-PowerShell verwendet werden kann Runspace - aber es gibt keinen einfachen, unkomplizierten Einzeiler, um das zu erstellen, SecureString
was Sie benötigen. Es ist eine kleine Unannehmlichkeit - aber wahrscheinlich lohnt sich , um sicherzustellen , dass die Anwendungen , die wirklich tun müssen , SecureString
um den Einsatz nicht dazu verleiten , die Autoren tun System.String
oder System.Char[]
Vermittler. :-)
Wenn Sie die Konvertierung von a string
in a SecureString
in eine LINQ
Anweisung komprimieren möchten, können Sie dies wie folgt ausdrücken:
var plain = "The quick brown fox jumps over the lazy dog";
var secure = plain
.ToCharArray()
.Aggregate( new SecureString()
, (s, c) => { s.AppendChar(c); return s; }
, (s) => { s.MakeReadOnly(); return s; }
);
Beachten Sie jedoch, dass die Verwendung LINQ
die Sicherheit dieser Lösung nicht verbessert. Es leidet unter dem gleichen Fehler wie jede Konvertierung von string
nach SecureString
. Solange das Original string
im Speicher bleibt, sind die Daten anfällig.
Abgesehen davon kann die obige Aussage die Erstellung der SecureString
, ihre Initialisierung mit Daten zusammenhalten und sie schließlich vor Änderungen schützen.
Die folgenden 2 Erweiterungen sollten den Trick machen:
Für ein char
Array
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
Und für string
public static SecureString ToSecureString(this string _self)
{
SecureString knox = new SecureString();
char[] chars = _self.ToCharArray();
foreach (char c in chars)
{
knox.AppendChar(c);
}
return knox;
}
Vielen Dank an John Dagg für die AppendChar
Empfehlung.
Sie können dieses einfache Skript verwenden
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
12345
... so etwas hat ein Idiot auf seinem Gepäck!"