散列和比较密码,在sql server中使用SHA1保存为散列

时间:2013-04-24 14:48:46

标签: sql-server stored-procedures

我有一个varbinary(max)类型的列,并使用随机生成的nvarchar(60)类型的salt。我使用hashbyte(密码+盐)保存了db并保存了密码。

现在我想比较用户密码并验证他。

我尝试使用他的密码并运行此查询 -

SELECT [email] from admin where 
[password]=HashBytes('SHA1','xxxxxx' +'/KsDnXdU+_a<t19wYCnEi/lxmXmAutR3DVA$#]~dSBskRMB?sb#41+=MFRpE')

它没有给我回电子邮件。我直接在sql server management studio上运行它。但它给了我空白。为什么会这样?

当我通过电子邮件选择获取角色时,这意味着电子邮件已注册。 我的盐或查询有问题吗?

我修好了。 Actualy直接添加salt会导致我的错误,虽然它是直接添加并计算哈希并且没有从sql server返回错误。

当我运行此查询时

Select role from admin where salt='/KsDnXdU+_a<t19wYCnEi/lxmXmAutR3DVA$#]~dSBskRMB?sb#41+=MFRpE'

我没有结果。我意识到,这是一些转换问题。我用了Convert(nvarchar(60),'%?r>%Vb+$hUZO8}=38/_J[@q@1mf^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[@q@1mf^rz!V&q~\dLH5nQ&/edR\c[6ya|q$e%r'))

这回复了我的电子邮件。我真的不确定为什么会这样,但使用sqlserver 2005,以上查询我修复了它。我请求版主,如果是sql server 2005中的任何错误,请让别人知道。

1 个答案:

答案 0 :(得分:0)

您在阅读和写作时需要使用相同的代码:

INSERT INTO dbo.admin (email, password, salt)
VALUES(@email,HashBytes('SHA2_512',@password+@salt),@salt);

SELECT email FROM dbo.admin
 WHERE password = HashBytes('SHA2_512',@password+salt);

唯一的区别是select引用了存储的salt而不是传入的salt。 您还应该使用SHA2算法,因为SHA1不再安全(http://www.md5decrypter.co.uk/sha1-decrypt.aspx)。对于SHA2_512,您的列需要为64个字节(http://msdn.microsoft.com/en-us/library/ms174415.aspx)。如果可能,您应该使用特定长度而不是(MAX)。

正如Aaron所说,SQL 2012之前不支持SHA2。您可以使用CLR实现。这可以帮助您入门:http://geekswithblogs.net/hroggero/archive/2009/09/19/strong-password-hashing-with-sql-server.aspx但是,它只使用256位。