我有一个简单的 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
,所以它应该可以工作,对吗?还是我遗漏了什么?
最佳答案
字符串参数默认以nvarchar
的形式传递;但是您的较长命令将 @password
转换为 varchar
,它具有不同的二进制表示形式,因此会生成不同的哈希摘要,如果它们的哈希生成方式不同,它将与您现有的记录不匹配.
顺便说一句,你也应该加盐。
关于c# - 为什么 SqlCommand 不在 HASHBYTES 函数中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983927/