【发布时间】:2014-04-30 22:14:28
【问题描述】:
我通常对存储敏感信息非常谨慎,并且更喜欢在可能的情况下使用 Facebook/Twitter 登录,以便他们处理密码。但是,我遇到了一个项目,除了在数据库中存储用户名/密码之外别无选择,我想确保我使用的代码在安全性方面完美无缺。
我已经编写了下面的过程,它将生成哈希密码并计划将@strPassword 和@strSalt 的结果存储在我的用户表中。
然后,网站/移动应用程序将对密码进行哈希处理,并通过 HTTPS 连接将其发布到 Web 服务,该服务会将哈希结果与盐相结合,并再次对其进行哈希处理,以将其与存储在我的表中的密码进行比较。
从我读到的内容来看,这应该防止彩虹表被用来解密它,以及使用 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)
【问题讨论】:
-
@strPassword 是用户的明文密码吗?
-
我很抱歉。当用户在内部系统(WinForms)上创建他们的帐户时,这个 sn-p 脚本运行。密码以纯文本形式传递到 SQL 中,然后使用 SHA_512 进行散列,结合盐,然后再次进行散列。任何地方都不会存储纯文本密码。
-
我明白了,我的意思只是确保您没有存储用户的纯文本密码。这将导致像 Target 最近经历的那样的黑客攻击。
标签: sql-server web-services security hash passwords