我有一个简单的SqlConnection代码,它有一个HASHBYTES函数来从我的服务器检索数据.
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand(commandString, connection))
{
command.Parameters.Add(new SqlParameter("mail", email));
command.Parameters.Add(new SqlParameter("password", password));
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
return true;
}
throw new InvalidDataException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
该CommandString中的属性如下:
DECLARE @pass varchar(50);
SET @pass = @password;
DECLARE @pwdHash varbinary(max);
SET @pwdHash = HASHBYTES('SHA2_256', @pass);
SELECT * FROM Users
WHERE email=@mail AND pwd=@pwdHash;
Run Code Online (Sandbox Code Playgroud)
此代码有效,但为什么下面的较短代码不起作用?
在下面的情况中,该函数不会进入while循环,而是抛出异常.
DECLARE @pwdHash varbinary(max);
SET @pwdHash = HASHBYTES('SHA2_256', @password);
SELECT * FROM Users
WHERE email=@mail AND pwd=@pwdHash;
Run Code Online (Sandbox Code Playgroud)
在这两个代码中,@ password值设置为a SqlParameter,因此它应该可以工作,对吧?或者我错过了什么?
字符串参数nvarchar默认传递; 但是你的较长命令会转换@password为varchar具有不同二进制表示的命令,因此如果它们的哈希值生成方式不同,则会生成与现有记录不匹配的不同哈希摘要.
顺便说一句,你也应该给哈希加盐.