0

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

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

然后像这样检查它:

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

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

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

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

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

4

2 回答 2

2

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

$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

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

攻击者之所以不能只使用该字符串并获取原始密码,是因为良好的加密散列函数的一个重要特性:“生成具有给定散列的消息是不可行的。”</p>

于 2011-06-24T08:39:36.837 回答
0

CheckPassword()返回原始密码。CheckPassword 只是检查传入的密码是否散列到传入的散列。如果是,则返回true,如果不是,则返回false。您可能想阅读phpass 文章“如何管理 PHP 应用程序的用户和密码”。这给出了密码散列一般如何工作的非常详细的描述,特别是在 phpass 中。

于 2011-06-24T08:51:00.927 回答