SQL Server - 存储密码

时间:2014-04-30 22:14:29

标签: sql-server web-services security hash passwords

我通常对存储敏感信息非常谨慎,并且喜欢在可能的情况下使用Facebook / Twitter登录,以便他们可以处理密码。但是,我已经达到了一个项目,除了在数据库中存储用户名/密码之外别无选择,我想确保我使用的代码在安全性方面完美无瑕。

我已经编写了下面的程序,该程序将生成哈希密码并计划将@strPassword和@strSalt的结果存储在我的用户表中。

然后,网站/移动应用程序将对密码进行哈希处理并通过HTTPS连接发布到Web服务,该服务将散列结果与salt相结合,并将其再次哈希,以便将其与存储在我的表中的密码进行比较。

从我读过的内容中,这应该可以防止使用彩虹表来解密它,以及使用SHA512来防止暴力破解,最后通过HTTPS来防止在传输过程中窃取任何密码。如果病毒在客户端设备上可以保存密码的副本,那么它就已经被部分散列。

这里是否存在任何潜在的缺陷,或者有更好的方法来实现这一目标吗?

DECLARE @strPassword VARCHAR(128)
DECLARE @strSalt VARCHAR(36)
DECLARE @strHashMethod VARCHAR(10) = 'SHA2_512'

SET @strPassword = HASHBYTES(@strHashMethod, 'MyPassword')
SET @strSalt = CONVERT(VARCHAR(36), NEWID())
SET @strPassword = HASHBYTES(@strHashMethod, @strSalt + @strPassword)

SELECT CONVERT(VARBINARY(128), @strPassword)

1 个答案:

答案 0 :(得分:0)

对我来说很安全!

如果您愿意,可以输入迭代计数,例如,在最后一行之前循环100次:

SET @strPassword = HASHBYTES(@strHashMethod, @strPassword)

或者,IC(迭代计数)可以是介于100和1000之间的随机int,并与散列密码和salt一起存储在基础表中。

使用NEWID()创建盐有点奇怪。我可能只是使用CRYPT_GEN_RANDOM(16)。