【发布时间】:2015-03-22 14:01:10
【问题描述】:
在我的应用程序中,HASHBYTES SQL 函数为相同的字符串返回不同的值。 下面是我的用户创建代码。
Guid fillerG = Guid.NewGuid();
using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES ('" + userNameTxt.Text + "', HASHBYTES ( 'SHA1', CONVERT(NVARCHAR(100), '" + userPassword.Text + fillerG.ToString() + "') ), '" + fillerG.ToString() + "'; ", con))
{
com.ExecuteNonQuery();
}
当我在我的登录页面中比较上面插入的行时,它不匹配。 这是我的比较脚本。
SqlCommand loginCom = new SqlCommand("select COUNT(UserID) FROM App_Users WHERE UserName = '" + Login1.UserName + "' AND PasswordHash = HASHBYTES('SHA1', '" + Login1.Password + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon);
第一个代码将密码哈希存储为:
0xDAC9280F85B40C06314228876717E342432807DB
但在查询窗口中,具有相同值的 HASHBYTES 函数返回:
0xA561FBD35713F922AD761594658C193F12B82791
更新: 看这张图,代码存储的密码Hash和查询生成的密码不一样(我给的密码是'ee')
【问题讨论】:
-
hashbytes 是一个确定性函数。如果您使用相同的哈希函数为其提供相同的输入,您将得到相同的结果。唯一的结论是这两个字符串实际上并不相等。我会打印两个字符串,检查前导/尾随、空格、不可见字符和编码。
标签: c# sql asp.net sql-server