1

我有一列 varbinary(max) 类型的列,并使用了随机生成的 nvarchar(60) 类型的盐。我将盐保存在数据库中并使用哈希字节(密码+盐)保存了密码。

现在我想比较用户密码并对他进行身份验证。

我尝试获取他的密码并运行此查询——

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

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

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

我修好了它。实际上直接添加盐给我带来了一个错误,尽管它是直接添加的并且计算了哈希并且没有从 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 中的任何错误,请让其他人知道。

4

1 回答 1

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

唯一的区别是选择引用存储的盐而不是传入的盐。您还应该使用 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 位。

于 2013-04-24T15:11:21.240 回答