Qu'est-ce que l'algorithme de hachage par défaut qui ASP.NET utilisations de l'adhésion?

qu'est-ce que l'algorithme de hachage par défaut qui ASP.NET utilisations de l'adhésion? Et comment puis-je le changer?

52
demandé sur Peter Mortensen 2009-07-16 16:51:39

6 réponses

EDIT: N'utilisez pas le fournisseur de membres tel quel parce qu'il est horriblement inadéquat en termes de protection des mots de passe de l'utilisateur

à la lumière du fait que googling" membership provider hashing algorithm " trouve cette réponse comme premier résultat, et l'Évangile qui sera inféré, il me incombe de mettre en garde les gens sur l'utilisation du fournisseur D'adhésion comme ceci et l'utilisation de hachages comme SHA-1, MD5 etc pour brouiller les mots de passe dans les bases de données.

tl; dr

utilisez une fonction de dérivation de clé comme bcrypt, scrypt ou (si vous avez besoin de la conformité FIPS) PBKDF2 avec un facteur de travail suffisant pour nécessiter le temps de hachage pour qu'un seul mot de passe soit aussi proche de 1000ms ou plus.

Hachages sont faciles à la force brute de ces jours, avec de nombreux exemples de violations de données dans l'histoire récente. Pour empêcher les mots de passe de votre utilisateur de finir sur pastebin dans le prochain hack, assurez-vous que les mots de passe sont hachés avec une fonction qui prend un suffisamment de temps pour calculer!

au lieu de fournisseur D'adhésion, essayez IdentityReboot ou le plus récentes implémentations de Microsoft que Troy Hunt parle de au moins.

il est également intéressant que sur les mêmes résultats google mentionnés ci-dessus je trouve un tutoriel montrer aux gens avec soin comment il est facile pour forcer ces hachures de mot de passe en utilisant des outils populaires comme JtR ou Hashcat. Sur un appareil GPU personnalisé, SHA1 peut être craqué à un taux d'étalement de 48867 millions de hashes par seconde ! avec un dictionnaire libre comme rockyou ou similaire , une personne motivée avec votre base de données aura très rapidement la plupart de vos mots de passe utilisateurs. En tant que développeur, c'est votre éthique responsabilité de faire le nécessaire pour protéger la sécurité des mots de passe de vos utilisateurs.


le hachage par défaut est SHA1 mais ils salent aussi et base64 il:

public string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Encoding.Unicode.GetBytes(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

si vous voulez en savoir plus sur la façon de le changer, je dois encore le découvrir (à moins d'utiliser le fournisseur personnalisé voir ci-dessous) mais SHA-1 est assez bon pour le moment. Si vous cherchez à l'inverser ou chercher à partir de ce ces gars ont fait un peu de travail sur ce: http://forums.asp.net/p/1336657/2899172.aspx

cette question aidera à inverser ou à dupliquer cette technique si c'est ce qui pourrait être nécessaire. Reimplement ASP.NET adhésion et mot de passe de L'utilisateur Hashing dans Ruby

si vous créez un fournisseur personnalisé, vous pouvez créer vos algorithmes et méthodes de hachage et de cryptage.

private byte[] ConvertPasswordForStorage(string Password)
      {
         System.Text.UnicodeEncoding ue = 
      new System.Text.UnicodeEncoding();
         byte[] uePassword = ue.GetBytes(Password);
         byte[] RetVal = null;
         switch (_PasswordFormat)
         {
            case MembershipPasswordFormat.Clear:
               RetVal = uePassword;
               break;
            case MembershipPasswordFormat.Hashed:

               HMACSHA1 SHA1KeyedHasher = new HMACSHA1();
               SHA1KeyedHasher.Key = _ValidationKey;
               RetVal = SHA1KeyedHasher.ComputeHash(uePassword);
               break;
            case MembershipPasswordFormat.Encrypted:
               TripleDESCryptoServiceProvider tripleDes = new 
       TripleDESCryptoServiceProvider();
               tripleDes.Key = _DecryptionKey;
               tripleDes.IV = new byte[8];
               MemoryStream mStreamEnc = new MemoryStream();
               CryptoStream cryptoStream = new CryptoStream(mStreamEnc, 
        tripleDes.CreateEncryptor(), 
      CryptoStreamMode.Write);

               cryptoStream.Write(uePassword, 0, uePassword.Length);
               cryptoStream.FlushFinalBlock();
               RetVal = mStreamEnc.ToArray();
               cryptoStream.Close();
               break;

         }
         return RetVal;
      }

private string GetHumanReadablePassword(byte[] StoredPassword)
      {
         System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding();
         string RetVal = null;
         switch (_PasswordFormat)
         {
            case MembershipPasswordFormat.Clear:
               RetVal = ue.GetString(StoredPassword);
               break;
            case MembershipPasswordFormat.Hashed:
               throw new ApplicationException(
        "Password cannot be recovered from a hashed format");

            case MembershipPasswordFormat.Encrypted:
               TripleDESCryptoServiceProvider tripleDes = 
        new TripleDESCryptoServiceProvider();
               tripleDes.Key = _DecryptionKey;
               tripleDes.IV = new byte[8];
               CryptoStream cryptoStream = 
        new CryptoStream(new MemoryStream(StoredPassword), 
      tripleDes.CreateDecryptor(), CryptoStreamMode.Read);
               MemoryStream msPasswordDec = new MemoryStream();
               int BytesRead = 0;
               byte[] Buffer = new byte[32];
               while ((BytesRead = cryptoStream.Read(Buffer, 0, 32)) > 0)
               {
                  msPasswordDec.Write(Buffer, 0, BytesRead);

               }
               cryptoStream.Close();

               RetVal = ue.GetString(msPasswordDec.ToArray());
               msPasswordDec.Close();
               break;
         }
         return RetVal;
      }

http://msdn.microsoft.com/en-us/library/aa479048.aspx

46
répondu Ryan Christensen 2017-05-23 12:17:54

Le la réponse ci-dessus par Ryan Christensen n'est pas complète. La partie où il convertit le sel en octet[] n'est pas correcte.

c'est un exemple de travail que j'ai implémenté dans une solution pour un client:

public string Hash(string value, string salt)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(value);
        byte[] src = Convert.FromBase64String(salt);
        byte[] dst = new byte[src.Length + bytes.Length];
        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
        HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
        byte[] inArray = algorithm.ComputeHash(dst);
        return Convert.ToBase64String(inArray);
    }
28
répondu Rawbert 2018-01-10 16:54:32

le type d'algorithme de hachage par défaut est SHA1. Il ya deux façons que vous pouvez le changer.

1) Si vous travaillez avec IIS 7, vous pouvez le mettre à jour en utilisant la configuration "Machine Key" (voir ci-dessous). Cela vous permet de choisir la méthode de cryptage à partir d'une liste d'options disponibles et de spécifier les clés ou les options de génération de clés.

Machine Key configuration page from IIS 7 administration tool

2) Si vous travaillez avec IIS 6 Vous pouvez changer le type d'algorithme de hachage en utilisant l'élément membership dans le web.fichier de configuration:

<membership
    defaultProvider="provider name"
    userIsOnlineTimeWindow="number of minutes"
    hashAlgorithmType="SHA1">
    <providers>...</providers>
</membership>

selon la documentation, la valeur de chaîne de caractères de l'attribut hashAlgorithmType peut être n'importe lequel des types d'algorithme de hachage fournis. Un peu de creuser montre que les valeurs valides pour ASP.Net 2, 3 et 3.5 sont MD5 , RIPEMD160 , SHA1 , SHA256 , SHA384 , SHA512 . L'important est ici que tous les ces classes héritent de HashAlgorithm .

la valeur de l'attribut hashAlgorithmType peut aussi être une entrée de l'élément cryptoNameMapping dans la machine.fichier de configuration. Vous pouvez l'utiliser si vous avez besoin d'un 3ème partie algorithme de hachage. Machine.le fichier de configuration peut typiquement être trouvé dans C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG si vous utilisez ASP.Net 2 ou plus. Vous pouvez en savoir plus sur la définition de ces valeurs ici .

27
répondu MikeD 2010-11-03 09:24:04

l'algorithme de hachage par défaut a changé en HMACSHA256 dans le Framework .NET 4.0.

Note that unlike SHA-1, HMAC SHA-256 is a keyyed hash. Si vos hashs se comportent de manière non-déterministe, vous n'avez probablement pas mis une clé, ce qui l'oblige à utiliser une clé aléatoire. Quelque chose semblable à ce qui suit serait le coupable (qui est ce que je viens de passer une heure à comprendre :p ).

HashAlgorithm.Create(Membership.HashAlgorithmType)

Si vous voulez travailler avec un fournisseur existant, vous peut revenir aux anciennes valeurs par défaut en utilisant ce guide .

26
répondu phloopy 2010-11-19 17:24:01

il y a une correction dans l'algorithme de hachage, vous devez utiliser:

byte[] src = Convert.FromBase64String(salt);

au lieu de

byte[] src = Encoding.Unicode.GetBytes(salt);

Lire l'article http://svakodnevnica.com.ba/index.php?option=com_kunena&func=view&catid=4&id=4&Itemid=5&lang=en#6

2
répondu Fox 2011-08-05 06:05:56

je joins un extrait montrant le code comme dans la réponse de Rawbert ci-dessus dans F#

open System
open System.Security.Cryptography
open System.Text

module PasswordHelper =
    let EncodePassword(pass : string, salt : string) =
        let bytes = Encoding.Unicode.GetBytes(pass)
        let src = Convert.FromBase64String(salt)
        let dst : byte array = Array.zeroCreate (src.Length + bytes.Length)
        Buffer.BlockCopy(src, 0, dst, 0, src.Length)
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length)
        let algorithm = HashAlgorithm.Create("SHA1")
        let inArray = algorithm.ComputeHash(dst)
        Convert.ToBase64String(inArray)

c'est le code de travail d'une application active

0
répondu Quintus Marais 2014-11-18 09:19:41