繁体   English   中英

SQL Server查询与varbinary类型列不匹配

[英]SQL Server query not matching for a varbinary type column

我在下面使用此查询来验证用户。

此查询在SQL Server和我的Asp.Net网站中完美运行。

SELECT * 
FROM AdminUsers 
WHERE username = 'admin' COLLATE SQL_Latin1_General_CP1_CS_AS 
  AND Password = (SELECT HASHBYTES('SHA1', 'admin123'))

但是,当我把它放在Asp.net/ C#代码中时:

dbManager.Command.CommandText = @"SELECT * FROM AdminUsers 
WHERE username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND
Password = (SELECT HASHBYTES('SHA1', @Password))";

dbManager.Command.Parameters.AddWithValue("@userName", username);
dbManager.Command.Parameters.AddWithValue("@Password", password);

reader = dbManager.GetDataReader();
if (reader.Read() == true)
{ //USER VALIDATED }

这不匹配所以不确定如何分配密码参数使它工作,只是为了确认输入的密码是正确的。 SQL Server表中的Password数据类型是VarBinary

有什么建议么?

@Password参数的数据类型不正确。

在您的第一个示例中,'admin123'是varchar ascii字符串。

在.net代码中, @Password是一个字符串,因此默认情况下设置为键入nvarchar unicode字符串。 这些哈希值为不同的值,即:

select hashbytes('SHA1', 'admin123')
select hashbytes('SHA1', N'admin123')

回报

0xF865B53623B121FD34EE5426C792E5C33AF8C227
0xB7BC3A1B04D9E165C6762B0A1CDE5226DF5B6A6A

您需要将其设置为varchar SqlDbType:

dbManager.Command.CommandText = @"SELECT * FROM AdminUsers 
WHERE  username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND
Password=(SELECT HASHBYTES('SHA1',@Password))";

dbManager.Command.Parameters.AddWithValue("@userName", username);
dbManager.Command.Parameters.AddWithValue("@Password", password)
    .SqlDbType = SqlDbType.VarChar;

reader = dbManager.GetDataReader();
if (reader.Read() == true)
{ //USER VALIDATED }

@userName@Password都是nvarchar HASHBYTESvarcharnvarchar非常敏感; 在您的工作示例中, 'admin123'varchar 您需要将这些参数显式指定为varchar (通过设置.DbType = System.Data.DbType.AnsiString ),或者(最好)在整个过程中使用nvarchar (如果已经散列,则为时太晚)。 注意: HASHBYTES本身可能不是加密的好选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM