手动转换密码和盐以与 ASPNETDB 密码进行比较

本文关键字:密码 ASPNETDB 比较 转换 | 更新日期: 2023-09-27 18:31:55

我正在尝试手动将 aspnetdb 密码字段与手动哈希密码进行比较以检查有效性(我不能使用默认的成员资格实现,因为我使用的是自定义成员资格实现)。无论如何,我从记录中获取 Base64 密码盐,并使用以下算法来获取加盐哈希:

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();
byte[] plainTextWithSaltBytes =
    new byte[plainText.Length + salt.Length];
for (int i = 0; i < plainText.Length; i++)
{
    plainTextWithSaltBytes[i] = plainText[i];
}
for (int i = 0; i < salt.Length; i++)
{
    plainTextWithSaltBytes[plainText.Length + i] = salt[i];
}
byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);
return hash;
}

然后,我获取这些字节并与Convert.GetBase64Bytes(MemberUser.Password)进行比较。不过,尽管某处存在断开连接,因为我从 Convert 方法获得的字节和我的计算哈希永远不会相同,即使我知道密码相同。

对我哪里出了问题有什么见解吗?

手动转换密码和盐以与 ASPNETDB 密码进行比较

在查看 SqlMemberProvider 的源代码时,他们似乎复制了密码之前的盐:

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();
byte[] plainTextWithSaltBytes = new byte[plainText.Length + salt.Length];
salt.CopyTo(plainTextWithSaltBytes, 0);
plainText.CopyTo(plainTextWithSaltBytes, salt.Length); 
byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);
return hash;
}