web-dev-qa-db-fra.com

Convertir une chaîne en SecureString

Comment convertir String en SecureString?

84
Nila

Vous pas. La raison d’utiliser l’objet SecureString est d’éviter de créer un objet chaîne (chargé en mémoire et conservé en texte brut jusqu’à la récupération de place). Cependant, vous pouvez ajouter des caractères à un SecureString en les ajoutant.

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

Il existe également un autre moyen de convertir entre SecureString et String

1. Chaîne à SecureString

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

2. SecureString to String

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

Voici le lien

79

la méthode ci-dessous permet de convertir une chaîne en chaîne sécurisée.

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

Vous pouvez suivre ceci:

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

Je vais jeter ça dehors. Pourquoi?

Vous ne pouvez pas simplement changer toutes vos chaînes pour sécuriser des chaînes et tout à coup votre application est "sécurisée". Chaîne sécurisée est conçue pour conserver la chaîne cryptée aussi longtemps que possible et uniquement pendant une très courte période, en effaçant la mémoire après une opération.

Je risquerais de dire que vous pouvez avoir des problèmes de conception avant de vous préoccuper de la sécurité de vos chaînes d’application. Donnez-nous plus d'informations sur ce que vous essayez de faire et nous pourrons peut-être vous aider.

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

Voici un truc linq pas cher.

            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

Je suis d'accord avec Spence (+1), mais si vous le faites pour apprendre ou tester des règles, vous pouvez utiliser un foreach dans la chaîne, en ajoutant chaque caractère à la chaîne sécurisée à l'aide de la méthode AppendChar.

4
Jonathan

pas de linq fantaisie, sans ajouter tous les caractères à la main, simplement et simplement:

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

Les 2 extensions suivantes devraient faire l'affaire:

  1. Pour un tableau char

    public static SecureString ToSecureString(this char[] _self)
    {
        SecureString knox = new SecureString();
        foreach (char c in _self)
        {
            knox.AppendChar(c);
        }
        return knox;
    }
    
  2. Et pour 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;
    }
    

Merci à John Dagg pour la recommandation AppendChar.

2
Peet

Si vous souhaitez compresser la conversion d'une string en une SecureString en une instruction LINQ, vous pouvez l'exprimer comme suit:

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; }
                       );

Cependant, gardez à l'esprit que l'utilisation de LINQ n'améliore pas la sécurité de cette solution. Elle souffre du même problème que toute conversion de string à SecureString. Tant que la string d'origine reste en mémoire, les données sont vulnérables.

Cela dit, la déclaration ci-dessus peut offrir garder en même temps la création de la variable SecureString, son initialisation avec des données et le verrouiller de toute modification.

2
cel sharp

vous pouvez utiliser ce script simple

private SecureString SecureStringConverter(string pass)
{
    SecureString ret = new SecureString();

    foreach (char chr in pass.ToCharArray())
        ret.AppendChar(chr);

    return ret;
}
1
nadir