【发布时间】:2011-06-13 21:06:00
【问题描述】:
我有一个关于盐的问题。例如,我们的记录中有 看起来像这样的数据库:
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="
是否有人可以在他们自己的环境中进行测试以了解为什么我会得到如此不同的结果?
【问题讨论】:
-
您永远不应该解密密码。将输入密码的散列/加盐值与存储的散列/加盐值进行比较。
-
谢谢科迪 - 同意。这就是我试图做的——只是没有很好地描述问题。正在尝试验证明文密码。
-
你确定它只是 SHA1 的一次迭代吗?在密码散列函数中,对散列进行数千次迭代是很常见的。 salt和密码之间应该有分隔符吗?
-
这还开着吗?看来您必须找出最初创建加盐密码的方式,然后复制此方法。猜测正确的算法没有多大意义。
-
对于如何应用盐以及如何编码参数,几乎有无数种细微的变化。如果没有关于所用程序的良好文档,我认为您不会完成这项工作。
标签: c# hash cryptography passwords