为什么SqlCommand不在HASHBYTES函数内传递参数?

时间:2016-10-11 18:14:16

标签: c# sql-server

我有一个简单的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,因此它应该有效,对吧?或者我错过了什么?

2 个答案:

答案 0 :(得分:6)

默认情况下,字符串参数以nvarchar传递;但是你的较长命令会将@password强制转换为具有不同二进制表示形式的varchar,因此如果它们的哈希值生成方式不同,则会生成与现有记录不匹配的不同哈希摘要。

顺便说一下,你也应该给哈希加盐。

答案 1 :(得分:0)

在较短的代码中,将@password的数据类型更改为VARCHAR 效果很好。