根据我的研究,如果你想安全地存储密码,你应该使用经过专业人士审查的内置哈希函数。最佳实践建议你不要添加硬编码的胡椒。

但为什么不呢?

假设:

  • DumbWebsite.com 的数据库完全泄露,其密码以纯文本形式存储。
  • YourWebsite.com 存储加密密码(根据最佳实践)。
  • 攻击者知道他们的目标同时使用 DumbWebsite.com 和您的网站。

什么可以阻止恶意行为者获取目标泄露的电子邮件和密码并登录您的网站?

在这种情况下,在密码传递给之前将您自己的秘密添加到密码中password_hash(),不会保护您的用户密码吗?

6

  • 那么你就是个“傻瓜”,因为你在不受信任的网站上重复使用了密码。


    – 


  • 4
    如果攻击者知道密码(并且没有其他身份验证因素),那么没有什么可以阻止他们登录。 Pepper 也无法解决这个问题,因为它是在后端自动添加的,而不是由用户提供的。攻击者(就像合法用户一样)不需要知道 Pepper。


    – 


  • @security_paranoid 是的,但我们总是假设我们的用户很笨,不是吗?我想尽可能地保护我的用户——尤其是当他们以可预见的方式愚蠢时。


    – 

  • 2
    @HC_:如果您担心密码重复使用,请告诉您的用户使用密码管理器,这样可以轻松为每个网站生成唯一的随机密码。或者切换到无密码身份验证,例如使用密钥的。如上所述,pepper 并不能解决密码重复使用的问题。


    – 

  • 2
    您指的是哪种“最佳实践”?因为 NIST 和 OWASP 都谈到了使用 Peppers。


    – 


最佳答案
1

你混淆了几个不同的概念。

首先,最佳实践绝对建议除了盐之外还要使用“胡椒”。例如,建议如下(重点是我的):

此外,验证者应使用秘密的、只有验证者知道的盐值执行密钥派生函数的额外迭代。如果使用此盐值,则应由经批准的随机位生成器 [SP 800-90Ar1] 生成,并至少提供 SP 800-131A 最新版本中规定的最低安全强度(截至本文发布之日为 112 位)。秘密盐值应与散列记忆秘密分开存储(例如,在硬件安全模块等专用设备中)。通过此额外迭代,只要秘密盐值保持秘密,对散列记忆秘密的暴力攻击就不切实际。

确实,您应该使用标准化的密码哈希函数,而不是尝试发明自己的算法,但这并不意味着您不能使用“pepper”。Argon2 等现代函数已经有一个用于附加密钥的参数。如果您使用的是等较旧的算法,则可以存储原始哈希的或加密哈希。两者都是标准算法的完美有效应用。

请注意,应将 Pepper 保存在专用密钥存储中,例如,或保存在硬件设备中,例如硬件安全模块或 TPM 芯片。在某些文件中硬编码机密并不能提供最佳保护。

与您的假设相反,“pepper” 并不能阻止攻击者使用已知密码登录 – 如果是这样的话,那么合法用户也无法登录,因为他们也不知道“pepper”。相反,这个秘密使暴力攻击更加困难,因为攻击者现在必须同时获得哈希值和“pepper”才能根据哈希值测试密码。根据“pepper”的保护程度,这可能会带来重大挑战。

因此,如果您主要担心的是密码重复使用,那么 Pepper 就无济于事了。相反,请告诉您的用户使用密码管理器生成唯一的随机密码。或者切换到无密码身份验证方法,例如(或至少将其作为一种选项提供)。