![](/img/trans.png)
[英]How a byte array is being stored in sql server table column of type 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
。 HASHBYTES
对varchar
和nvarchar
非常敏感; 在您的工作示例中, 'admin123'
是varchar
。 您需要将这些参数显式指定为varchar
(通过设置.DbType = System.Data.DbType.AnsiString
),或者(最好)在整个过程中使用nvarchar
(如果已经散列,则为时太晚)。 注意: HASHBYTES
本身可能不是加密的好选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.