Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL HASHBYTES返回不同的值_C#_Sql_Asp.net_Sql Server - Fatal编程技术网

C# SQL HASHBYTES返回不同的值

C# SQL HASHBYTES返回不同的值,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,在我的应用程序中,HASHBYTES SQL函数为同一字符串返回不同的值。 下面是我的用户创建代码 Guid fillerG = Guid.NewGuid(); using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, PasswordHash, PasswordSalt) VALUES ('" + userNameTxt.Text + "', HASHBYTES ( 'SHA1', CONVERT(NV

在我的应用程序中,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);
第一个代码存储passwordHash,如下所示:

0xDAC9280F85B40C06314228876717E342432807DB
但在查询窗口中,具有相同值的HASHBYTES函数返回以下内容:

 0xA561FBD35713F922AD761594658C193F12B82791
更新: 检查此图像,代码存储的密码散列与查询生成的密码不同(我给出的密码是“ee”)

您正在将两个不同的字符串传递给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();
}
Login1.Password.Replace("'", "''") + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon);
您正在使用
userPassword.Text+fillerG.ToString()
作为字符串 但是

在此查询中:

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

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


hashbytes是一个确定性函数。如果您使用相同的散列函数向它提供相同的输入,您将得到相同的结果。唯一的结论是这两个字符串实际上并不相等。我会打印两个字符串,检查前导/尾随、空格、不可见字符和编码。不,,,这不是问题,,,我正在替换两个代码上的引号。。。为了在我的帖子中简洁起见,我在第一段代码中删除了这些参数。我尝试添加参数,但仍然…:(嗨,你能检查一下我的问题的更新吗。我怀疑这是数据类型转换的问题。NVARCHAR和VARCHAR给了我不同的结果。天哪,我不敢相信它能工作…当我将fillerG的数据类型从表中的UniqueIdentifier更改为NVARCHAR时它能工作:)谢谢你的朋友