0

我正在尝试手动将 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(MembershipUser.Password) 进行比较。尽管我从 Convert 方法获得的字节和我计算的哈希值永远不会相同,即使我知道密码相同,但在某处存在断开连接。

关于我哪里出错的任何见解?

4

1 回答 1

0

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

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;
}
于 2012-04-23T11:15:47.020 回答