Utilisez les meilleures pratiques actuelles pour hacher en toute sécurité les mots de passe dans .NET
Lors du stockage de mots de passe dans une base de données, il est essentiel de protéger les informations sensibles à l'aide d'algorithmes de hachage. Les méthodes de cryptage ne conviennent pas à cette fin. Le meilleur algorithme de hachage de mot de passe natif dans .NET est PBKDF2 (Password-Based Key Derivation Function 2).
Guide étape par étape pour le hachage de mot de passe à l'aide de PBKDF2
Étape 1 : Générer la valeur du sel
Le sel est une valeur aléatoire utilisée pour rendre unique le hachage de chaque mot de passe. Créez une valeur de sel à l'aide d'un PRNG cryptographique (générateur de nombres pseudo-aléatoires) :
<code class="language-csharp">byte[] salt; new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);</code>
Étape 2 : Créer un objet PBKDF2 et calculer la valeur de hachage
Instanciez la classe Rfc2898DeriveBytes
et spécifiez le mot de passe, le sel et le nombre d'itérations souhaité (~ 100 000 recommandé) :
<code class="language-csharp">var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20);</code>
Étape 3 : Combinez les octets de sel et de chiffrement pour le stockage
Combinez les octets de sel et de mot de passe pour créer une seule chaîne pour le stockage de la base de données :
<code class="language-csharp">byte[] hashBytes = new byte[36]; Array.Copy(salt, 0, hashBytes, 0, 16); Array.Copy(hash, 0, hashBytes, 16, 20);</code>
Étape 4 : Convertir en chaîne Base64 pour le stockage
Encodez les octets combinés dans une chaîne Base64 pour les stocker dans la base de données :
<code class="language-csharp">string savedPasswordHash = Convert.ToBase64String(hashBytes);</code>
Étape 5 : Vérifiez le mot de passe saisi par l'utilisateur
Pour vérifier que le mot de passe saisi par l'utilisateur correspond au hachage stocké :
<code class="language-csharp">string savedPasswordHash = DBContext.GetUser(u => u.UserName == user).Password; byte[] hashBytes = Convert.FromBase64String(savedPasswordHash); byte[] salt = new byte[16]; Array.Copy(hashBytes, 0, salt, 0, 16); var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20); for (int i=0; i < 20; i++) if (hashBytes[i+16] != hash[i]) throw new UnauthorizedAccessException();</code>
Remarque : Le nombre d'itérations peut être ajusté en fonction des exigences de performances de l'application. Une valeur minimale généralement recommandée est de 10 000.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!