4 votes

Comment reproduire le hachage du mot de passe créé par l'adhésion par défaut d'asp.net MVC

J'utilise le système d'adhésion par défaut asp.net MVC 4, et le client doit envoyer une signature comprenant son mot de passe haché, pour l'authentification.

J'ai besoin de hacher un mot de passe de la même manière que le mot de passe haché par le serveur.

    private static bool IsAuthenticated(string hashedPassword, string message, string signature)
    {
        if (string.IsNullOrEmpty(hashedPassword))
            return false;

        var verifiedHash = ComputeHash(hashedPassword, message);
        if (signature != null && signature.Equals(verifiedHash))
            return true;

        return false;
    }

Alors comment puis-je reproduire le mot de passe haché comme un mot de passe stocké dans la base de données ?

1voto

Esteban Elverdin Points 3442

Je ne suis pas sûr de comprendre votre question, mais il n'est pas nécessaire de comparer des mots de passe hachés. L'adhésion a déjà une méthode pour valider un utilisateur, vous devriez juste utiliser

Membership.ValidateUser(username, password)

Si vous utilisez le fournisseur d'adhésion et l'authentification par formulaire, vous pouvez vérifier si l'utilisateur est déjà connecté.

 User.Identity.IsAuthenticated

1voto

phil soady Points 4463

Voir le Classe System.Web.Helpers.Crypto La méthode HashPassword méthode. Le fournisseur SimpleMemberShip utilise cette classe pour les services cryptographiques.

Vous pourriez simplement lire l'entrée de la BD :-)

Pour plus d'informations, voir http://msdn.microsoft.com/en-us/library/system.web.helpers.crypto%28v=vs.111%29.aspx

BTW, n'oubliez pas de prendre en compte le SALT. Votre processus exige-t-il que vous combiniez la passe et le sel avant le hachage ?

0voto

MonkeyBonkey Points 4169

Le fournisseur d'adhésion .net utilise un hachage HMACSHA1 qui est codé en base64. Vous pouvez recréer le même hachage en utilisant uniquement javascript du côté client. L'astuce est de s'assurer que le mot de passe et la clé de hachage sont les mêmes et d'utiliser l'encodage utf-16le. Voici la solution utilisant crypto-js. Je ne sais pas pourquoi la fonction utf-16le de crypto-js ne produit pas le même résultat, j'utilise donc une fonction utf différente.

//not sure why crypt-js's utf16LE function doesn't give the same result
//words = CryptoJS.enc.Utf16LE.parse("test");
//utf16 = CryptoJS.enc.Utf16LE.stringify("test");

function str2rstr_utf16le(input) {
  var output = [],
      i = 0,
      l = input.length;

  for (; l > i; ++i) {
    output[i] = String.fromCharCode(
      input.charCodeAt(i)        & 0xFF,
      (input.charCodeAt(i) >>> 8) & 0xFF
    );
  }

  return output.join('');
}

var pwd = str2rstr_utf16le("test");
var hash = CryptoJS.HmacSHA1(pwd, pwd);

var encodedPassword = CryptoJS.enc.Base64.stringify(hash);

0voto

Doğa Gençer Points 124

Méthode complète de Crypto.cs @ System.Web.Helpers :

/// <summary>Returns an RFC 2898 hash value for the specified password.</summary>
/// <returns>The hash value for <paramref name="password" /> as a base-64-encoded string.</returns>
/// <param name="password">The password to generate a hash value for.</param>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="password" /> is null.</exception>
public static string HashPassword(string password)
{
  if (password == null)
    throw new ArgumentNullException("password");
  byte[] salt;
  byte[] bytes;
  using (Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 16, 1000))
  {
    salt = rfc2898DeriveBytes.Salt;
    bytes = rfc2898DeriveBytes.GetBytes(32);
  }
  byte[] inArray = new byte[49];
  Buffer.BlockCopy((Array) salt, 0, (Array) inArray, 1, 16);
  Buffer.BlockCopy((Array) bytes, 0, (Array) inArray, 17, 32);
  return Convert.ToBase64String(inArray);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X