今日、Webアプリケーションを.net 4.0に移動しましたが、FormsAuthが機能しなくなりました。SqlMembershipProvider(組み込みのSqlMembershipProviderの簡略化されたバージョン)を数時間調べた後、HMACSHA256ハッシュに一貫性がないことがわかりました。これは暗号化方法です:
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);
}
同じパスワードとsaltを2回渡すと、異なる結果が返されます!!! .NET3.5では完全に機能していました
重大な変更を知っている人はいますか、それとも既知のバグですか?
更新:ハッシュアルゴリズムとしてSHA512を指定すると、すべてが正常に機能するため、.NET4.0でのHMACSHA256ハッシュアルゴリズムの実装のバグだと思います。
ありがとう!アンドレイ