2012-11-20 140 views
1

我試圖執行一次登錄檢查,將存儲在數據庫中的憑證重新存入數據庫,其中電子郵件是純文本並且密碼保存爲SHA1。目前,用戶已經手動創建。爲了檢查登錄細節,我決定使用存儲過程。 這裏的問題:SHA1密碼加密錯誤

下面的查詢中SHA1返回密碼:

SELECT HASHBYTES('SHA1', 'password') 
// returns 0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8 

以下查詢確認用戶是否存在:

SELECT COUNT(*) from users where email='[email protected]' 
and password='0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8' // returns 1 

現在來這裏的存儲過程(提取的select語句從「密碼」是一個佔位符的整個過程),它似乎不應該返回1,因爲它應該:

SELECT COUNT(*) from users where email='[email protected]' 
and password=(SELECT HASHBYTES('SHA1', 'password')) // returns 0 

有誰知道爲什麼?

+0

什麼是數據類型的'password'?你是否存儲一個字符串或varbinary?爲什麼你的varbinary值用引號括起來(第二個查詢)? –

回答

3

SELECT HASHBYTES()返回類型varbinary,並且您的密碼列似乎是一個varchar。

解決方案爲OP工作:

SELECT COUNT(*) from users where email='[email protected]' and password=(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', 'password'), 1, 0)) 
+0

那麼密碼列以前是NVARCHAR(100),但是在我將其更改爲VARBINARY(100)後,問題依然存在......我將嘗試播放轉換,儘管 –

+0

VARBINARY(100)是否截斷條目? – jpumford

+1

此問題的解決方案是將密碼列設置爲VARCHAR(40),以便它適合該值,並且密碼複製是通過以下方式完成的:SELECT COUNT(*)from users where email='[email protected]'和密碼=(master.dbo.fn_varbintohexsubstring(0,HashBytes('SHA1','password'),1,0))。謝謝! –