抱歉,这可能很愚蠢,但我对Phpass有些不了解。如果我可以创建一个安全的哈希密码,如下所示:
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
以后再检查一下:
$checked = $pwdHasher->CheckPassword($password, $hash);
然后这意味着逻辑上密码必须以只能在特定机器上读取的方式存储(否则有人可以在另一台机器上使用“CheckPassword”功能来获取密码)。 Phpass是如何做到的?
如果我将来需要将网站迁移到新服务器,这不会导致问题吗?如何安全备份我的数据库,以便在主服务器出现故障时,我可以恢复所有密码? (我错过了一些明显的东西吗?)
编辑 - 响应下面的评论,如果不同的机器不影响它,那么如果黑客可以访问我的数据库,为什么他们不能只在自己的机器上执行CheckPassword来获取原始密码?对不起,我一定错过了一些明显的东西。
编辑2 - 该死的,我错过了一些明显的东西。 compare函数仅检查给定的密码与散列的密码,并返回true或false - 您实际上不必访问密码本身。道歉是愚蠢的!
答案 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中。