【问题标题】:SQL HASHBYTES returns different valueSQL HASHBYTES 返回不同的值
【发布时间】: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


【解决方案1】:

您将两个不同的字符串传递给 HASHBYTES 这就是您的原因 得到不同的结果。

在这个查询中:

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();
}

您正在使用userPassword.Text +fillerG.ToString() 作为字符串 但是

在这个查询中:

Login1.Password.Replace("'", "''") + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon);

您正在替换引号

Login1.Password.Replace("'", "''")

试试这样:使用参数化查询

SqlCommand cmd = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES (@username, HASHBYTES ( 'SHA1', CONVERT(NVARCHAR(100),@pass')),@salt), con)

    cmd.Parameter.AddWithValue("@username",userNameTxt.Text);
    cmd.Parameter.AddWithValue("@pass",userPassword.Text);
    cmd.Parameter.AddWithValue("@salt",fillerG.ToString());

 SqlCommand cmd = new SqlCommand("select COUNT(UserID) FROM App_Users WHERE UserName = @username AND PasswordHash = HASHBYTES ( 'SHA1', CONVERT(NVARCHAR(100),@salt)))), con)

cmd.Parameter.AddWithValue("@username",userNameTxt.Text);
cmd.Parameter.AddWithValue("@salt",Login1.Password);

Login1.Password 和 FillerG.ToString() 必须相同

【讨论】:

  • 不,,,这不是问题,,,我正在替换两个代码上的引号......为了在我的帖子中简洁,我删除了第一个代码中的那些。
  • 我尝试添加参数,但仍然... :( 您好,请查看我的问题的更新。
  • 我怀疑这是数据类型转换的问题。 NVARCHAR,而 VARCHAR 给了我不同的结果。
  • 天哪,我不敢相信它的工作原理......当我将表中的 FillerG 的数据类型从 UniqueIdentifier 更改为 NVarchar 时它工作了 :) 非常感谢朋友
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多