Question

J'ai une application de bureau avec une interface distante. L'accès à l'interface distante est sécurisée par un nom d'utilisateur et mot de passe.

Quelle serait la meilleure façon de les enregistrer le mot de passe en toute sécurité, de préférence dans le registre?

Était-ce utile?

La solution

Vous devez enregistrer le mot de passe haché (que ce soit dans le registre ou ailleurs). Ensuite, lorsque l'utilisateur entre son mot de passe que vous vérifiez la version hachée de ce qu'ils entrent dans la version hachée telle qu'elle est enregistrée. Si ceux-ci correspondent alors les mots de passe correspondant et vous pouvez laisser l'utilisateur.

De cette façon, vous n'êtes pas stocker le mot de passe en texte clair pour tout le monde (y compris vous) pour obtenir à et d'avoir accès comme quelqu'un d'autre.

Quant à l'algorithme de hachage à utiliser - Je ne sais pas. Il y a beaucoup de choix, donc je suis réticent à recommander un aveugle. Je vous suggère de trouver plusieurs et les évaluer. CSharpFriends a un article qui ressemble à cela pourrait être un bon point de départ .

Autres conseils

Si vous avez besoin de stocker un mot de passe non hachés, regardez en utilisant le ProtectedData classe . Cela rend l'utilisation de l'API DPAPI (Data Protection) qui est la meilleure façon d'obtenir des données sur Windows .

Voici une petite classe qui enveloppe ProtectedData et fournit deux méthodes d'extension sur chaîne pour crypter et décrypter les données:

public static class DataProtectionApiWrapper
{
    /// <summary>
    /// Specifies the data protection scope of the DPAPI.
    /// </summary>
    private const DataProtectionScope Scope = DataProtectionScope.CurrentUser;

    public static string Encrypt(this string text)
    {
        if (text == null)
        {
            throw new ArgumentNullException("text");
        }

        //encrypt data
        var data = Encoding.Unicode.GetBytes(text);
        byte[] encrypted = ProtectedData.Protect(data, null, Scope);

        //return as base64 string
        return Convert.ToBase64String(encrypted);
    }

    public static string Decrypt(this string cipher)
    {
        if (cipher == null)
        {
            throw new ArgumentNullException("cipher");
        }

        //parse base64 string
        byte[] data = Convert.FromBase64String(cipher);

        //decrypt data
        byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);
        return Encoding.Unicode.GetString(decrypted);
    }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top