Le 29 juillet 2010 à 06:54
Quand vous utilisez un String, celui-ci est stocké en clair en mémoire. Cela peut être problématique surtout quand vous avez besoin de travailler sur des informations sensibles (mot de passe, carte bancaire, licence… etc).
Pour cela, la classe SecureString (System.Security.SecureString), disponible depuis le framework .NET 2.0, permet de mettre en mémoire une chaîne de caractère de manière cryptée (utilisant DPAPI). De plus, avec SecureString vous contrôlez sa disposition en mémoire, ce qui n’est pas forcément le cas d’un “simple” String.
Par contre, son utilisation n’est pas aussi “simple” qu’un String. Pour cela je propose deux méthodes d’extensions :
Convertir un String en SecureString :
public static SecureString ConvertToSecureString(this string value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
char[] chars = value.ToCharArray();
SecureString secureValue = new SecureString();
foreach (char c in chars)
{
secureValue.AppendChar(c);
}
secureValue.MakeReadOnly();
return secureValue;
}
Convertir un SecureString en String :
public static string ConvertToString(this SecureString value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
IntPtr ptrString = IntPtr.Zero;
try
{
ptrString = Marshal.SecureStringToGlobalAllocUnicode(value);
return Marshal.PtrToStringUni(ptrString);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(ptrString);
}
}
Et l’utilisation (didactique, je ne le conseille pas en cas réel ! Ici c’est en “dur” ; alors que c’est à utiliser par rapport aux données entrées par l’utilisateur par exemple ;-))
String myPassword = "password"; // à ne pas faire ! Juste pour exemple
SecureString securePassword = myPassword.ConvertToSecureString();
Trace.WriteLine(securePassword.ConvertToString());
A bientôt !
73daa553-86ec-419c-af92-7e53d1698383|1|5.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04