我有一个简单的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();
}
}
}
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;
此代码有效,但为什么下面的较短代码不起作用?
在下面的情况中,该函数不会进入while循环,而是抛出异常。
DECLARE @pwdHash varbinary(max);
SET @pwdHash = HASHBYTES('SHA2_256', @password);
SELECT * FROM Users
WHERE email=@mail AND pwd=@pwdHash;
在这两个代码中, @password 值都设置为SqlParameter
,因此它应该有效,对吧?或者我错过了什么?
答案 0 :(得分:6)
默认情况下,字符串参数以nvarchar
传递;但是你的较长命令会将@password
强制转换为具有不同二进制表示形式的varchar
,因此如果它们的哈希值生成方式不同,则会生成与现有记录不匹配的不同哈希摘要。
答案 1 :(得分:0)
在较短的代码中,将@password的数据类型更改为VARCHAR
效果很好。