Phpass - 无法访问所有密码的危险?

时间:2011-06-24 08:12:41

标签: php security phpass

抱歉,这可能很愚蠢,但我对Phpass有些不了解。如果我可以创建一个安全的哈希密码,如下所示:

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

以后再检查一下:

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

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

如果我将来需要将网站迁移到新服务器,这不会导致问题吗?如何安全备份我的数据库,以便在主服务器出现故障时,我可以恢复所有密码? (我错过了一些明显的东西吗?)

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

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

2 个答案:

答案 0 :(得分:2)

bcrypt创建的哈希使用模块化的crypt格式,该格式不仅包含哈希值,还使用了哈希函数的指示符,轮次数以及用于创建哈希值的salt。在您的情况下,返回的字符串如下所示:

$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

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

攻击者不能只使用此字符串并获取原始密码的原因是因为良好cryptographic hash functions的一个重要属性:“生成具有给定散列的消息是不可行的。” / p>

答案 1 :(得分:0)

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