it-swarm.com.de

Konvertieren Sie String in SecureString

Wie konvertiere ich String in SecureString?

84
Nila

Du nicht Der ganze Grund für die Verwendung des SecureString-Objekts besteht darin, zu vermeiden, dass ein String-Objekt erstellt wird (das in den Speicher geladen wird und dort bis zur Speicherbereinigung im Klartext bleibt). Sie können jedoch Zeichen zu einem SecureString 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');
103
John Dagg

Es gibt auch eine andere Möglichkeit, zwischen SecureString und String zu konvertieren. 

1. String zu SecureString

SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;

2. SecureString to String

string theString = new NetworkCredential("", theSecureString).Password;

Hier ist der Link

79

die untenstehende Methode hilft, Zeichenfolge in sichere Zeichenfolge umzuwandeln

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;
}
50
M2012

Sie können dem folgen:

string password = "test";
SecureString sec_pass = new SecureString();
Array.ForEach(password.ToArray(), sec_pass.AppendChar);
sec_pass.MakeReadOnly();
17
Scorpio

Ich werde das da draußen werfen. Warum?

Sie können nicht einfach alle Ihre Zeichenfolgen in sichere Zeichenfolgen ändern, und plötzlich ist Ihre Anwendung "sicher". Eine sichere Zeichenfolge soll die Zeichenfolge so lange wie möglich verschlüsselt halten und nur für eine sehr kurze Zeit entschlüsseln, wobei der Speicher gelöscht wird, nachdem eine Operation darauf ausgeführt wurde.

Ich könnte sagen, dass Sie einige Probleme mit dem Designlevel haben, bevor Sie sich um die Sicherung Ihrer Anwendungszeichenfolgen kümmern. Geben Sie uns weitere Informationen dazu, was Sie versuchen, und wir können möglicherweise besser helfen.

7
Spence
unsafe 
{
    fixed(char* psz = password)
        return new SecureString(psz, password.Length);
}
6
hypersw

Hier ist ein billiger Linq-Trick.

            SecureString sec = new SecureString();
            string pwd = "abc123"; /* Not Secure! */
            pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c));
            /* and now : seal the deal */
            sec.MakeReadOnly();
5
granadaCoder

Ich stimme mit Spence (+1) überein, aber wenn Sie es zum Lernen oder Testen von Posen tun, können Sie einen foreach in der Zeichenfolge verwenden, der jedes Zeichen mit der AppendChar-Methode an den sicheren Ring anfügt.

4
Jonathan

kein schickes linq, nicht alle zeichen von hand, nur schlicht und einfach:

var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
3
garglblarg

Die folgenden 2 Erweiterungen sollten den Trick ausführen:

  1. 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;
    }
    
  2. 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;
    }
    

Dank an John Dagg für die AppendChar-Empfehlung.

2
Peet

Wenn Sie die Umwandlung einer string in eine SecureString-Anweisung in eine LINQ-Anweisung komprimieren möchten, können Sie sie 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 von LINQ die Sicherheit dieser Lösung nicht verbessert. Sie hat den gleichen Fehler wie jede Konvertierung von string in SecureString. Solange das Original string im Speicher verbleibt, sind die Daten anfällig.

Das heißt, das, was die obige Anweisung bieten kann, besteht darin, die Erstellung von SecureString, die Initialisierung mit Daten zusammenzuhalten und sie schließlich gegen Modifikationen zu sperren.

2
cel sharp

Ich möchte nur alle Leute darauf hinweisen, die sagen: "Das ist nicht der Sinn von SecureString", dass sich viele der Leute, die diese Frage stellen, in einer Anwendung befinden könnten, in der sie, aus welchen Gründen auch immer, gerechtfertigt sind oder nicht sind nicht besonders besorgt darüber, dass eine temporäre Kopie des Kennworts als GC-fähige Zeichenfolge auf dem Heap gespeichert wird, müssen jedoch eine API verwenden, die nur akzeptiert SecureString Objekte. Sie haben also eine App, in der Sie nicht care angeben, ob sich das Kennwort auf dem Heap befindet, möglicherweise nur für den internen Gebrauch und das Kennwort nur dort, weil es von den zugrunde liegenden Netzwerkprotokollen benötigt wird. und Sie stellen fest, dass diese Zeichenfolge, in der das Kennwort gespeichert ist, nicht verwendet werden kann, um z Richten Sie einen Remote-PowerShell-Runspace ein. Es gibt jedoch keinen einfachen Einzeiler, um das SecureString zu erstellen, das Sie benötigen. Es ist eine kleine Unannehmlichkeit - aber wahrscheinlich lohnt es sich sicherzustellen, dass die Anwendungen, die wirklich doSecureString benötigen, die Autoren nicht dazu verleiten, System.String Oder System.Char[] Vermittler. :-)

2

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;
}
1
nadir