【问题标题】:Phpass - danger of not being able to access all passwords?Phpass - 无法访问所有密码的危险?
【发布时间】:2011-06-24 16:51:00
【问题描述】:

对不起,这可能很愚蠢,但我对 Phpass 有一些不明白的地方。如果我可以像这样创建一个安全的散列密码:

$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );

然后像这样检查它:

$checked = $pwdHasher->CheckPassword($password, $hash); 

这意味着从逻辑上讲,密码必须以只能在特定机器上读取的方式存储(否则有人可以在另一台机器上使用“CheckPassword”功能来获取密码)。 Phpass 是如何做到这一点的?

如果我将来需要将网站移动到新服务器上,这不会造成问题吗?如何安全地备份我的数据库,以便在发生重大服务器故障时,我可以恢复所有密码? (我是否遗漏了一些明显的东西?)

编辑 - 针对下面的 cmets,如果不同的机器不影响它,那么如果黑客访问了我的数据库,为什么他们不能在自己的机器上执行 CheckPassword 以获取原始密码?抱歉,我一定遗漏了一些明显的东西。

编辑 2 - 该死,我遗漏了一些明显的东西。 compare 函数只检查给定的密码和散列的密码并返回 true 或 false - 你实际上不必访问密码本身。为自己愚蠢道歉!

【问题讨论】:

  • 不同的机器不会有任何影响。
  • 机器为什么会影响它?
  • CheckPassword 返回原始密码。 CheckPassword 只是检查传入的密码是否散列到传入的散列。如果是,则返回true,如果不是,则返回false

标签: php security phpass


【解决方案1】:

bcrypt 创建的哈希使用模块化 crypt 格式,它不仅包含哈希值,还包含使用的哈希函数、轮数和用于创建哈希值的盐的指标。在您的情况下,返回的字符串如下所示:

$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

这意味着验证密码所需的所有内容都存储在此字符串中。

攻击者之所以不能只使用这个字符串并获取原始密码,是因为良好的cryptographic hash functions 的一个重要属性:“生成具有给定哈希值的消息是不可行的。”

【讨论】:

  • 该死,我遗漏了一些明显的东西! compare 函数只检查给定的密码和散列的密码并返回 true 或 false - 您实际上不必访问密码本身。为自己愚蠢道歉!
【解决方案2】:

CheckPassword()返回原始密码。 CheckPassword 只是检查传入的密码是否散列到传入的散列。如果是,则返回true,如果不是,则返回false。您可能想阅读phpass article "How to manage a PHP application's users and passwords"。这对密码散列的一般工作方式进行了非常详细的描述,特别是在 phpass 中。

【讨论】:

  • @james.bcn,不要觉得自己很愚蠢。还有更多的人不知道答案。您选择提出问题,而不是仅仅依靠未知数。
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 2013-09-29
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多