Langage C# – Sécuriser les chaînes de caractères
Lors de l’exécution d’une application développée avec le langage C#, le contenu des variables de type System.String n’est pas sécurisé. Avec un logiciel tel que ProcessHacker, il est possible de consulter leur contenu.
Ainsi, d’un point de vue sécurité, il n’est pas conseillé d’utiliser le type System.String pour créer des variables contenant des données sensibles (mots de passe, codes secrets, …). Il est alors recommandé d’utiliser le type de données System.Security.SecureString.
Voici une première méthode d’extension permettant d’obtenir un objet de type SecureString à partir d’une chaîne de caractères :
[cc lang= »csharp »]
public static SecureString GetSecureString(this string aTexte)
{
// Variables locales.
SecureString oSecureString;
// Initialisation.
oSecureString = new SecureString();
// Alimentation.
foreach (char caracter in aTexte)
{
oSecureString.AppendChar(caracter);
}
// Retour.
return oSecureString;
}
[/cc]
Voici une seconde méthode d’extension, permettant d’obtenir le contenu d’un objet de type SecureString :
[cc lang= »csharp »]
public static string GetString(this SecureString aSecureString)
{
// Variables locales.
int iNbCaracteres;
char[] oTabChar;
IntPtr intPrt;
// Initialisation.
intPrt = IntPtr.Zero;
iNbCaracteres = aSecureString.Length;
oTabChar = new char[iNbCaracteres];
try
{
// Parcours des données.
intPrt = Marshal.SecureStringToGlobalAllocUnicode(aSecureString);
for (int i = 0; i < iNbCaracteres; i++)
{
oTabChar[i] = (char)Marshal.ReadInt16(intPrt, i * 2);
}
}
finally
{
// Libération.
Marshal.ZeroFreeGlobalAllocUnicode(intPrt);
}
// Sérialisation et retour.
return new string(oTabChar);
}
[/cc]