我正在开发身份验证服务。
我知道为每个用户生成唯一盐的做法,使用散列密码存储在数据库中,以防止彩虹表攻击。
我只是想在代码中添加第二个盐,在数据库中不存在,所以如果数据库被泄露(但不是代码),即使是弱密码也不容易受到暴力破解。
对我来说,我似乎是个好主意,但由于我不是专家,我希望得到信息安全方面优秀人士的确认。
我正在开发身份验证服务。
我知道为每个用户生成唯一盐的做法,使用散列密码存储在数据库中,以防止彩虹表攻击。
我只是想在代码中添加第二个盐,在数据库中不存在,所以如果数据库被泄露(但不是代码),即使是弱密码也不容易受到暴力破解。
对我来说,我似乎是个好主意,但由于我不是专家,我希望得到信息安全方面优秀人士的确认。
你的第二个“盐”是一个被描述为“胡椒”的概念。基本上,它可以工作,但有一个隐含密钥管理的缺点(“胡椒”实际上是密码学家所说的秘密密钥):当您更新软件或切换到较新的机器时,您必须注意转移胡椒值,否则您将使所有哈希值无法验证。
Peppering 最好通过首先以正常方式计算散列,然后在其上计算一些HMAC,以胡椒作为密钥来完成。在数据库中,您存储散列参数(盐、迭代计数)和 HMAC 输出(当然不存储散列值本身)。这很有效,特别是因为 HMAC 是确定性的。