2013-04-24 75 views
1

我有VARBINARY(最大)的塔型使用SHA1保存爲散列和用於爲nvarchar(60)的鹽鍵入隨機生成的密碼。我使用hashbyte(密碼+鹽)將salt保存在db中並保存了密碼。散列並比較這是SQL Server

現在我想比較用戶密碼並驗證他。

我試圖以他的密碼,並運行此query--

SELECT [email] from admin where 
[password]=HashBytes('SHA1','xxxxxx' +'/KsDnXdU+_a<t19wYCnEi/lxmXmAutR3DVA$#]~dSBskRMB?sb#41+=MFRpE') 

它沒有返回我的電子郵件。我直接在sql server management studio上運行它。但它給了我空白。爲什麼這樣?

當通過電子郵件即時得到角色IM選擇,這意味着電子郵件已註冊。 我的鹽或查詢有問題嗎?

我修好了。實際上直接添加鹽給我造成了一個錯誤,儘管它直接被添加並計算了散列值,並且沒有從sql server返回錯誤。

,當我跑這個查詢

Select role from admin where salt='/KsDnXdU+_a<t19wYCnEi/lxmXmAutR3DVA$#]~dSBskRMB?sb#41+=MFRpE' 

我沒有結果。我意識到,這是一些轉換問題。我用那麼Convert(nvarchar(60),'%?r>%Vb+$hUZO8}=38/_J[@[email protected]^rz!V&q~\dLH5nQ&/edR\c[6ya|q$e%r')

,跑到我的查詢作爲

SELECT [email] from admin where 
[password]=HashBytes('SHA1', 'xxxxxx'+Convert(nvarchar(60),'%?r>%Vb+$hUZO8}=38/_J[@[email protected]^rz!V&q~\dLH5nQ&/edR\c[6ya|q$e%r')) 

這回我的電子郵件。我真的不知道爲什麼會發生這種情況,但使用sqlserver 2005和上面的查詢我修復了它。我請求版主,如果它是sql server 2005中的任何錯誤,請讓別人知道。

INSERT INTO dbo.admin (email, password, salt) 
VALUES(@email,HashBytes('SHA2_512',@[email protected]),@salt); 

SELECT email FROM dbo.admin 
WHERE password = HashBytes('SHA2_512',@password+salt); 

唯一的區別是,選擇引用存儲鹽代替食鹽傳遞:

回答

0

你讀書時和寫入時需要使用相同的代碼。 您也應該使用SHA2算法,因爲SHA1不再安全(http://www.md5decrypter.co.uk/sha1-decrypt.aspx)。對於SHA2_512,您的列需要爲64個字節(http://msdn.microsoft.com/en-us/library/ms174415.aspx)。如果可能,您應該使用特定的長度而不是(MAX)。

正如Aaron指出的那樣,SQL 2012之前不支持SHA2。您可以使用CLR實現。這可以讓你開始:http://geekswithblogs.net/hroggero/archive/2009/09/19/strong-password-hashing-with-sql-server.aspx然而,它只使用256位。

+0

我本地測試它在sqlserver 2005上,但我的服務器有sql server 2008r2。我怎樣才能做到這一點?我的簡單查詢無法使用密碼及其散列產生我的電子郵件或角色 – 2013-04-24 15:20:04

+0

好點,@AaronBertrand。我在回答中添加了這個評論。 – 2013-04-24 15:22:24