【发布时间】:2012-08-27 10:23:52
【问题描述】:
长期以来,我一直在使用 PHPPass 对我的密码进行哈希处理。我承认仍然有一些我不完全理解(或忽略)正确散列密码的事情,所以今天我正在审查我能找到的所有信息。
查看 PHPass 文档,我已经进入了这个:
除了实际的散列之外,phpass 在新密码或密码被散列时透明地生成随机盐,并将散列类型、盐和密码拉伸迭代计数编码到它返回的“散列编码字符串”中。当 phpass 针对存储的散列验证密码或密码短语时,它同样透明地提取并使用散列类型标识符、盐和“散列编码字符串”中的迭代计数。 因此,您无需自己费心腌制和拉伸 - phpass 会为您解决这些问题。
我把困扰我的句子加粗了。
我一直认为盐应该是秘密的,因为攻击者不应该知道它。因此,如果理解正确,PHPass 会将使用的盐存储在同一个哈希中,以便在比较密码并检查是否有效时能够使用它。
我的问题是
- 这安全吗?如果散列被泄露,攻击者拥有用于散列密码的盐......这里有一些我想念的东西。
- 我真的可以在这里为密码加盐而烦恼吗?我真的可以依赖 PHPass 吗?
【问题讨论】:
-
通过添加
salt,您又增加了一层安全性。这是Defense in Depth的主要原理。但如果 phpass 已经添加了盐,则不会添加另一层。 -
1.) 您关注哪种安全性?你能说得更具体一点吗? - 2.) 你能在几分之一秒内用是或否自信地回答以下问题:“Phpass 使用盐吗?” - 说出你能回答的确定性和速度以及答案。
-
@hakra 我指的是存储盐和密码的行为。我一直认为将它存储在不同的地方(例如读取数据库字段)会更好。
-
@Raúl 如何将盐简单地存储在单独的数据库字段中(我假设在同一个表中)以任何显着方式增强安全性?
-
我知道开发人员会错误地解释 salt,就像
$hash = md5(SECRET_SALT . $user_password)所做的那样,其中 SECRET_SALT 是整个应用程序中的一个秘密常量。因此,如果攻击者发现它,他/她可以使用它来暴力破解密码,但这不是使用盐的方式。盐应该是随机的,并且对于每个用户来说都是不同的,并且它们是否公开并不重要。