同时泄露盐和加密密码的安全风险是什么?

What is the Security Risk of Giving Away Both the Salt and Encrypted Password?

我继承了一个要维护的应用程序,我刚刚发现当用户登录时,成功登录返回的JSON包含:

似乎拥有 Salt 和 Encrypted 密码通常会使 salt 的目的无效。

暴力破解或查找 table 攻击现在可以再次作为破解方法使用。

我的看法是否正确,还有比这更多的威胁吗?

这不是最好的,但通常可以透露盐分。你在想一个要保密的pepper

加盐哈希并不是为了防止暴力攻击。这是为了防止 rainbow attack。通过在散列算法的输入值中包含盐,就不可能预先计算查找 tables,除非黑客为每个可能的盐创建查找 table。

在我看来,即使不是泄露密码之类的事情,您也泄露了您的前端根本不需要的信息,这可能会导致攻击者获取密码!我的意思是,是的,如果攻击者获得了该信息,他仍然需要进行详尽的搜索,将所有可能的密码组合与该 salt 连接起来(或使用该 salt 对密码字典进行哈希处理),但是您正在为他提供离线资源攻击,现在他可以随心所欲地尝试不同的密码,直到他厌倦为止,或者他得到了真正的密码。

有人可能会认为这与攻击者尝试使用不同的密码进行身份验证是一样的,但主要区别在于,在在线攻击中,您可以限制登录尝试的次数,因此他不会想试多少就试多少,在离线攻击中,想试多少密码就试多少。

所有这一切都可以通过发送一个布尔值而不是完整的对象来避免,因为它不需要一个巨大的重构或类似的东西,我认为这是需要修复的东西(你还应该看看他对这些信息做了什么,在最坏的情况下,他正在检索密码的哈希值以将其存储在 cookie 或本地存储中以保持对用户的身份验证,或类似的东西。

如果 salt & hash 只能从 POST 到登录处理程序,那么这里的损害非常有限。

如果有一些网络方法 (/currentUser/getDetails) returns 数据,那么如果网站其他地方存在任何跨站点脚本 (XSS) 漏洞,这就是一个风险。任何攻击者都可以通过XSS调用该方法,然后获取散列密码和salt进行离线破解。

另一个低风险是如果 JSON 响应没有 output anti-caching headers 那么同一台计算机的另一个用户可能能够检索他们的密码哈希。

我更担心的是密码散列采用 Hash(Password+Salt) 格式,而不是使用 bcrypt 或 pbkdf2 等安全算法的格式。