Aujourd'hui, j'ai déplacé mon application Web vers .net 4.0 et Forms Auth ne fonctionnait plus. Après plusieurs heures de creuser dans mon SqlMembershipProvider (version simplifiée de SqlMembershipProvider intégré), j'ai trouvé que le hachage HMACSHA256 n'est pas cohérent. C'est la méthode de cryptage:Erreur de cryptage incorrecte dans .NET 4.0
internal string EncodePassword(string pass, int passwordFormat, string salt)
{
if (passwordFormat == 0) // MembershipPasswordFormat.Clear
return pass;
byte[] bIn = Encoding.Unicode.GetBytes(pass);
byte[] bSalt = Convert.FromBase64String(salt);
byte[] bAll = new byte[bSalt.Length + bIn.Length];
byte[] bRet = null;
Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
if (passwordFormat == 1)
{ // MembershipPasswordFormat.Hashed
HashAlgorithm s = HashAlgorithm.Create(Membership.HashAlgorithmType);
bRet = s.ComputeHash(bAll);
} else
{
bRet = EncryptPassword(bAll);
}
return Convert.ToBase64String(bRet);
}
Passer le même mot de passe et sel deux fois donne des résultats différents !!! Il fonctionnait parfaitement dans .NET 3.5
Quelqu'un est-il au courant de tout changement de rupture, ou est-ce un bug connu?
MISE À JOUR: Quand je précise SHA512 que l'algorithme de hachage, tout fonctionne très bien, donc je ne crois que c'est un bogue dans la mise en œuvre de l'algorithme de hachage HMACSHA256 dans .NET 4.0
Merci! Andrey