Yes*_*ses 2 c# sql sql-server asp.net
在我的应用程序中,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();
}
Run Code Online (Sandbox Code Playgroud)
当我在登录页面中比较上面插入的行时,它不匹配.这是我的比较脚本.
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);
Run Code Online (Sandbox Code Playgroud)
第一个代码将passwordHash存储为:
0xDAC9280F85B40C06314228876717E342432807DB
Run Code Online (Sandbox Code Playgroud)
但是在查询窗口中,具有相同值的HASHBYTES函数返回:
0xA561FBD35713F922AD761594658C193F12B82791
Run Code Online (Sandbox Code Playgroud)
更新: 检查此图片,代码存储的密码哈希不同于查询生成的密码(我给的密码是'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();
}
Run Code Online (Sandbox Code Playgroud)
你正在使用userPassword.Text +fillerG.ToString()String但是
在此查询中:
Login1.Password.Replace("'", "''") + "' + CONVERT(NVARCHAR(36), PasswordSalt))", loginCon);
Run Code Online (Sandbox Code Playgroud)
您正在替换报价
Login1.Password.Replace("'", "''")
Run Code Online (Sandbox Code Playgroud)
试试这样:使用参数化查询
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());
Run Code Online (Sandbox Code Playgroud)
和
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);
Run Code Online (Sandbox Code Playgroud)
Login1.Password和fillerG.ToString()必须相同
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |