我正在尝试再次登录检查存储在数据库中的凭据,其中电子邮件是纯文本,密码保存为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
有谁知道为什么?
答案 0 :(得分: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))