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 :

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

Voici une seconde méthode d’extension, permettant d’obtenir le contenu d’un objet de type SecureString :

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

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.