2013-04-24 55 views
1

我有VARBINARY(最大)的塔型使用SHA1保存为散列和用于为nvarchar(60)的盐键入随机生成的密码。我使用hashbyte(密码+盐)将salt保存在db中并保存了密码。散列并比较这是SQL Server

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

我试图以他的密码,并运行此query--

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

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

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

我修好了。实际上直接添加盐给我造成了一个错误,尽管它直接被添加并计算了散列值,并且没有从sql server返回错误。

,当我跑这个查询

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

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

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

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

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

唯一的区别是,选择引用存储盐代替食盐传递:

回答

0

你读书时和写入时需要使用相同的代码。 您也应该使用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位。

+0

我本地测试它在sqlserver 2005上,但我的服务器有sql server 2008r2。我怎样才能做到这一点?我的简单查询无法使用密码及其散列产生我的电子邮件或角色 – 2013-04-24 15:20:04

+0

好点,@AaronBertrand。我在回答中添加了这个评论。 – 2013-04-24 15:22:24