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);
}
Vous pouvez utiliser Linq:
"fizzbuzz".ToCharArray ().ToList ().ForEach ( p => secureString.AppendChar ( p ) );
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;
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.
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);
var s = "fizzbuzz".Aggregate(new SecureString(), (ss, c) => { ss.AppendChar(c); return ss; });
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.
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.
moins de code car .ToList()
n'est pas requis pour cela:
Array.ForEach("fizzbuzz".ToCharArray(), secureString.AppendChar);