我有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);
唯一的區別是,選擇引用存儲鹽代替食鹽傳遞:
我本地測試它在sqlserver 2005上,但我的服務器有sql server 2008r2。我怎樣才能做到這一點?我的簡單查詢無法使用密碼及其散列產生我的電子郵件或角色 – 2013-04-24 15:20:04
好點,@AaronBertrand。我在回答中添加了這個評論。 – 2013-04-24 15:22:24