我正在尝试对用户名和密码匹配的用户名表进行查询。该表是预先存在的(在公司软件安装期间创建)表,我无法更改加密类型或方法。使用字符串作为密码的查询完全正常但当我尝试使用整数查询时,查询返回null。
"SELECT *
FROM ITF_USER
WHERE ITF_LOGIN = '$lcUserName'
AND ITF_PASS = HashBytes('SHA1', '$lcPassword')";
如果密码类似于'helloworld'
,那么查询工作正常,但'1121321'
不会返回任何内容。有什么建议吗?
更新 如果我将表存储的密码与php的sha1($ lcPassword)结果进行比较,我会看到导致空查询结果的细微差别:
table -> 0x3FEEAC0B3A75CF1C12A8420CDE593FA275CCE584
sha1()-> 8feeac0b3a75cf1c12a8420cde598fa275cce584
sha1()结果中有两个8应该是3的
答案 0 :(得分:1)
我试过了:
declare @vc varchar(255), @nvc nvarchar(255)
set @vc = '1111'
set @nvc = '1111'
select hashbytes('sha1', @vc)
select hashbytes('sha1', @nvc)
它返回了不同的值:
varchar = 0x011C945F30CE2CBAFC452F39840F025693339C42
nvarchar = 0x40C7BD210D05DBEA19402B952DD416E487450955
在调用HashBytes()
时,似乎第二个参数的数据类型有所不同。当您使用字符串并且varchar
转换为int
(或反之亦然)时,可能会传递nvarchar
。
将所有内容强制为一种类型可能会有效:HashBytes('SHA1', cast('$lcPassword' as varchar(255))