2012-11-20 141 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))。谢谢! –