c# - 为什么 SqlCommand 不在 HASHBYTES 函数中传递参数?

标签 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,所以它应该可以工作,对吗?还是我遗漏了什么?

最佳答案

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

顺便说一句,你也应该加盐。

关于c# - 为什么 SqlCommand 不在 HASHBYTES 函数中传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39983927/

相关文章:

C# 错误的 PKCS7 填充

sql - sql server 中的新行

c# - 当 FCK 编辑器放置在更新面板中时如何从 FCK 编辑器获取编辑值

SQL Server DELETE 使用索引时速度较慢

sql-server - SQL Azure : list all logins and users

sql - 查看是什么导致了 SQL 触发器?

SQL Server 在新表中使用透视/逆透视

c# - MVC 项目在打开 Chrome Pane 后立即停止调试

c# - WebApi OAuth UseOAuthBearerAuthentication 给出 "Sequence contains more than one element"错误

C# List<T>.ToArray 性能不好?