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

时间:2012-04-23 10:55:50

标签: c# asp.net .net hash

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

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方法得到的字节和我的计算哈希是不一样的。

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

1 个答案:

答案 0 :(得分:0)

在查看SqlMembershipProvider的源代码时,似乎他们在密码之前复制了salt

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;
}