1

我正在尝试对存储在数据库中的凭据执行登录检查,其中电子邮件是纯文本,密码保存为 SHA1。目前,用户是手动创建的。为了检查登录详细信息,我决定使用存储过程。这是问题所在:

以下查询在 SHA1 中返回密码:

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

以下查询确认用户存在:

SELECT COUNT(*) from users where email='test@gmail.com'
 and password='0x5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8' // returns 1

现在出现了存储过程(从整个过程中提取的 select 语句,其中 'password' 是一个占位符),它似乎没有返回 1,因为它应该:

SELECT COUNT(*) from users where email='test@gmail.com'
 and password=(SELECT HASHBYTES('SHA1', 'password')) // returns 0

有谁知道为什么?

4

1 回答 1

3

SELECT HASHBYTES() 返回类型 varbinary 并且您的密码列似乎是 varchar。

为 OP 工作的解决方案:

SELECT COUNT(*) from users where email='test@gmail.com' and password=(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', 'password'), 1, 0))
于 2012-11-20T18:22:32.530 回答