我们使用 SHA2 和以下盐对用户密码(在 .net Web 应用程序中)进行哈希处理:
- 应用程序 salt - 存储在数据库之外(在我们的例子中,Web 应用程序 web.config 作为加密字符串) - 这被传递给涉及登录、创建新用户和更改密码等的存储过程。
- 每个用户 salt - 一个 SQL 唯一标识符 - 当前存储在用户表中 - 在插入时使用默认值自动生成
(CONVERT([char](36),newid(),(0)))
- 数据库盐- 存储在数据库中的设置表中的盐。
- 密码- 当然还有用户密码。
虽然这有助于彩虹和字典攻击等,但我在想如果有人确实发现我们的安全漏洞并设法对数据库运行更新语句会发生什么 - 特别是 - 什么会阻止用户使用我们的网站注册他们知道的密码,然后用他们的盐和散列替换管理员帐户上的盐和散列 - 从而让他们对我们的站点/应用程序具有完全的管理员访问权限?
这是我们应该真正担心的风险吗?如果有,是否有技术术语/标准预防技术?
我正在考虑以某种方式将用户 ID(在我们的例子中是一个整数)包含在哈希中 - 只是好奇这方面的最佳实践是什么,或者我们是否过度思考?
PS:我知道 SHA2 不是用于密码的理想哈希,并且首选 BCrypt 等较慢的哈希方法,这是我参与该项目之前做出的决定
PS:我们的 Web 应用程序(及其应用程序密钥)受到 SQL 服务器的严格防火墙 - 它们之间只有一个端口是开放的,并且用于 SQL)