[英]How can I verify a plaintext password with a hash algorithm?
我对盐有疑问。 例如,我们的数据库中有一条记录如下:
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);
返回的内容看起来与数据库中的密码不一样。
我想知道我是否还应该对盐做些什么? 我应该将数据库中存储的内容传递给EncodePassword方法,还是在两者之间有一个步骤要在将其作为参数传递之前对其进行解码?
我只是不确定为什么我遇到密码不匹配的问题。 根据我正在处理的站点的web.config,它是passwordFormat =“ Hashed”,并且数据库中的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="
有人可以在自己的环境中进行测试以查看为什么我得到如此不同的结果吗?
如果要传递的盐与存储在数据库中的盐完全相同,那么您正在处理的是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);
}
顺便说一句,尽管您的问题反复提到解密密码,但在我看来,您似乎只是在尝试针对存储的哈希验证纯文本密码。 如果是这样,那么上面的代码应该没问题。
如果您真的想解密存储的哈希,那就不要打扰! 哈希不是密码的加密版本,因此无法解密。
SHA1不能轻易解密,这就是它用来存储密码的原因之一。 您为什么要尝试解密密码?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.