web-dev-qa-db-fra.com

Utilisation de SecureString

Cela peut-il être simplifié en un seul revêtement? N'hésitez pas à le réécrire complètement tant que secureString est correctement initialisé.

SecureString secureString = new SecureString ();
foreach (char c in "fizzbuzz".ToCharArray())
{
    secureString.AppendChar (c);
}
47
Todd Smith

Vous pouvez utiliser Linq:

"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );
46
Sascha

Utilisez simplement NetworkCredential. Il a la logique de conversion intégrée.

SecureString ss = new NetworkCredential("", "fizzbuzz").SecurePassword;

Comme d'autres l'ont noté, toutes ces techniques retirent les avantages de SecureString en matière de sécurité, mais dans certaines situations (comme les tests unitaires), cela peut être acceptable.

Mise à jour:

Comme indiqué dans les commentaires, NetworkCredential peut également être utilisé pour reconvertir un SecureString en une chaîne.

string s = new NetworkCredential("", ss).Password;
47
Kevin

Outre l'utilisation de code dangereux et d'un char*, il n'y a pas (bien) mieux.

Le point ici n'est pas de copier le contenu de SecureString vers/depuis des chaînes normales. La constante "fizzbuzz" constant est la fuite de sécurité ici.

26
Henk Holterman

Légère amélioration de la réponse de Sascha en remplaçant la lambda par un groupe de méthodes

"fizzbuzz".ToCharArray().ToList().ForEach(ss.AppendChar);
16
Peter Kelly
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
14
Kevin

Voici comment la classe NetworkCredential de .NET le fait:

SecureString secureString;
fixed (char* chPtr = plainString)
  secureString = new SecureString(chPtr, plainString.Length);

Moche mais probablement le plus efficace.

8
Boris Lipschitz

Puisque SecureString utilise l'interface IDispose. Vous pourriez réellement le faire comme ça.

SecureString secure = new SecureString();
foreach(var character in data.ToCharArray())
    secure.AppendChar(character);

Essentiellement, le data serait un paramètre.

Si vous utilisez le using pour alléger les ressources; vous devrez faire attention à la portée. Mais cela peut être une alternative avantageuse, selon l'utilisation.

Mise à jour:

Vous pouvez réellement faire une signature de méthode complète:

public static SecureString ConvertStringToSecureString(this string data)
{
     var secure = new SecureString()
     foreach(var character in data.ToCharArray())
         secure.AppendChar(character);

     secure.MakeReadOnly();
     return secure;

}

Pour le déchiffrement que vous voudriez faire:

public static string ConvertSecureStringToString(this SecureString data)
{
     var pointer = IntPtr.Zero;
     try
     {
          pointer = Marshal.SecureStringToGlobalAllocUnicode(data);
          return Marshal.PtrToStringUni(pointer);
     }
     finally
     {
          Marshal.ZeroFreeGlobalAllocUnicode(pointer);
     }
}

Ce qui suit article vous fournira également des informations supplémentaires.

5
Greg

moins de code car .ToList() n'est pas requis pour cela:

Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);
3
Gerrie Pretorius