2011-07-05 61 views
2

我試圖對用戶名和密碼匹配的用戶名錶進行查詢。該表是預先存在的(在公司軟件安裝期間創建的)表,並且我沒有能力更改加密類型或方法。用字符串作爲密碼的查詢工作得很好,但是當我嘗試使用整數查詢時,查詢返回null。如何使用整數值與SQL Server查詢利用HashBytes

"SELECT * 
FROM ITF_USER 
WHERE ITF_LOGIN = '$lcUserName' 
AND ITF_PASS = HashBytes('SHA1', '$lcPassword')"; 

如果密碼是一樣的東西'helloworld'那麼查詢工作正常,但'1121321'不返回任何東西。有什麼建議麼?

UPDATE 如果我用PHP的SHA1($ lcPassword)結果我看到引起空查詢結果略有差異比較表中存儲的密碼:

table -> 0x3FEEAC0B3A75CF1C12A8420CDE593FA275CCE584 
sha1()-> 8feeac0b3a75cf1c12a8420cde598fa275cce584 

有兩個8位的中SHA1 ()的結果,應該是3的

+0

對於SQL,它並沒有多大關係,如果你在'「hello''或'」傳遞123'',它仍然是一個字符串。問題可能出現在其他代碼中;仔細檢查設置或更新密碼的代碼。 – Andomar

回答

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))