C# Language Hachage de mot de passe


Exemple

Les mots de passe ne doivent jamais être stockés en texte brut! Ils doivent être hachés avec un sel généré aléatoirement (pour se défendre contre les attaques par table arc-en-ciel) en utilisant un algorithme de hachage à mot de passe lent. Un nombre élevé d'itérations (> 10k) peut être utilisé pour ralentir les attaques par force brute. Un délai de ~ 100 ms est acceptable pour un utilisateur qui se connecte, mais rend difficile la suppression d'un long mot de passe. Lorsque vous choisissez un nombre d'itérations, vous devez utiliser la valeur maximale tolérable pour votre application et l'augmenter à mesure que les performances de l'ordinateur s'améliorent. Vous devrez également envisager d'arrêter les requêtes répétées qui pourraient être utilisées comme une attaque par déni de service.

Lors du premier hachage, un sel peut être généré pour vous, le hachage et le sel obtenus peuvent alors être stockés dans un fichier.

private void firstHash(string userName, string userPassword, int numberOfItterations)
{
    Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(userPassword, 8, numberOfItterations);    //Hash the password with a 8 byte salt
    byte[] hashedPassword = PBKDF2.GetBytes(20);    //Returns a 20 byte hash
    byte[] salt = PBKDF2.Salt;
    writeHashToFile(userName, hashedPassword, salt, numberOfItterations); //Store the hashed password with the salt and number of itterations to check against future password entries
}

Vérifier le mot de passe d'un utilisateur existant, lire son hash et son sel dans un fichier et le comparer au hachage du mot de passe saisi

private bool checkPassword(string userName, string userPassword, int numberOfItterations)
{
    byte[] usersHash = getUserHashFromFile(userName);
    byte[] userSalt = getUserSaltFromFile(userName);
    Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(userPassword, userSalt, numberOfItterations);    //Hash the password with the users salt
    byte[] hashedPassword = PBKDF2.GetBytes(20);    //Returns a 20 byte hash            
    bool passwordsMach = comparePasswords(usersHash, hashedPassword);    //Compares byte arrays
    return passwordsMach;
}