如何使用哈希算法验证明文密码?

时间:2011-01-23 00:21:14

标签: c# hash cryptography passwords

我对盐有疑问。例如,我们有一个记录 数据库看起来像这样:

Password: YUphoRF70vJEPAOjMmc/9n47hyQ= 
Password Format: 1 
Password Salt: Vx37L8ItQo3rJzx5gRCxTw==

我正在尝试验证此密码,但我使用的方法无效。

这是方法:

public static string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Encoding.Unicode.GetBytes(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

我这样传递:

string encodedPasswd = Cryptography.EncodePassword(ClearTxtPassword, DbPasswordSalt);

返回的内容与数据库中的密码不同。

我想知道我应该对盐做些什么吗?是 存储在DB中的内容我应该传递给EncodePassword方法或者是什么 在它之间有一个步骤,我应该在将它作为一个传递之前解码它 参数?

我只是不确定为什么我的密码不匹配。根据我正在处理的网站的web.config,它是passwordFormat =“Hashed”,DB中的PasswordFormat列说“1”所以我知道它是SHA1。

你有什么想法,为什么我没有得到正确的匹配或如何进一步找出它?(是的,我有正确的密码。)

编辑:

我尝试了以下更新方法:

public static string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

根据我当前的数据库数据,它仍然无法匹配。例如,我得到了 结果如下:

passwordText = "administrator"
passwordformat: 1 / SHA1
passwordSaltInDb: "zVhahfmXj9MrOQySyPQ1Qw=="
passwordInDb = "YZ5xRJkNG9erGStAkWJA3hID9vE="


encodedPasswordResults = "DWZ6XRtVMy4l+XSUOKoX8usUOJI="

有没有人可以在自己的环境中测试,看看为什么我会得到如此不同的结果?

2 个答案:

答案 0 :(得分:1)

如果你完全按照存储在数据库中的盐传入盐,那么你正在处理Base-64编码的字符串。要将其转换为byte[]数组,您应使用Convert.FromBase64String而不是Unicode.GetBytes。这些方面的东西:

public static string EncodePassword(string pass, string salt)
{
    byte[] bytes = Encoding.Unicode.GetBytes(pass);
    byte[] src = Convert.FromBase64String(salt);
    byte[] dst = new byte[src.Length + bytes.Length];
    Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
    HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
    byte[] inArray = algorithm.ComputeHash(dst);
    return Convert.ToBase64String(inArray);
}

顺便说一下,虽然你的问题反复提到解密密码,但它看起来好像你只是想对存储的哈希验证明文密码。如果是这种情况,则上述代码应该没问题。

如果你真的试图解密存储的哈希,那就不要打扰了!哈希不是密码的加密版本,因此无法对其进行解密。

答案 1 :(得分:0)

SHA1不易解密,这是用于存储密码的原因之一。你为什么试图解密密码?