【问题标题】:SHA1 password encryption errorSHA1密码加密错误
【发布时间】:2012-11-20 18:17:03
【问题描述】:

我正在尝试对存储在数据库中的凭据执行登录检查,其中电子邮件是纯文本,密码保存为 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

有人知道为什么吗?

【问题讨论】:

  • password的数据类型是什么?您是存储字符串还是 varbinary?为什么您的 varbinary 值用引号括起来(第二个查询)?

标签: asp.net sql-server-2008 sha1


【解决方案1】:

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))

【讨论】:

  • 嗯,密码列曾经是 NVARCHAR(100),但在我将其更改为 VARBINARY(100) 后,问题仍然存在......我会尝试使用转换
  • VARBINARY(100) 是否会截断条目?
  • 解决这个问题的方法是把密码列设置为 VARCHAR(40) 使其适合值,密码比较是这样完成的:SELECT COUNT(*) from users where email= 'jpodwysocki@gmail.com' 和密码=(master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', 'password'), 1, 0))。谢谢!
  • 我认为更好的解决方案是将 varbinary 密码存储为 varbinary,而不必费心来回转换为字符串。这似乎是白费了很多额外的工作。
猜你喜欢
  • 2011-03-03
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多