我对盐有疑问。例如,我们有一个记录 数据库看起来像这样:
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="
有没有人可以在自己的环境中测试,看看为什么我会得到如此不同的结果?
答案 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不易解密,这是用于存储密码的原因之一。你为什么试图解密密码?