Phpass-无法访问所有密码的危险?
抱歉,这可能很愚蠢,但我对Phpass有些不了解。如果我可以创建如下安全哈希密码:Phpass-无法访问所有密码的危险?,php,security,phpass,Php,Security,Phpass,抱歉,这可能很愚蠢,但我对Phpass有些不了解。如果我可以创建如下安全哈希密码: $pwdHasher = new PasswordHash(8, FALSE); $hash = $pwdHasher->HashPassword( $password ); $checked = $pwdHasher->CheckPassword($password, $hash); $2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhh
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
$checked = $pwdHasher->CheckPassword($password, $hash);
$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
然后像这样检查:
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
$checked = $pwdHasher->CheckPassword($password, $hash);
$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
这就意味着,从逻辑上讲,密码必须以这样一种方式存储,即它们只能在特定的机器上读取(否则,有人可以在另一台机器上使用“CheckPassword”功能来获取密码)。Phpass是如何做到这一点的
如果我将来需要将一个网站移动到一个新的服务器上,这不会导致问题吗?如何安全地备份数据库,以便在服务器出现重大故障时恢复所有密码?(我是不是遗漏了一些明显的东西?)
编辑-对于下面的评论,如果不同的机器不影响它,那么如果黑客访问我的数据库,为什么他们不能在自己的机器上执行CheckPassword以获得原始密码?对不起,我一定是漏掉了什么明显的东西
编辑2-该死,我错过了一些明显的东西。compare函数只检查给定密码与散列密码,并返回true或false-您实际上不必访问密码本身。为自己的愚蠢道歉 bcrypt创建的哈希使用模块化加密格式,该格式不仅包含哈希值,还包含所用哈希函数的指示符、轮数和用于创建哈希值的salt。在您的情况下,返回的字符串如下所示:
$pwdHasher = new PasswordHash(8, FALSE);
$hash = $pwdHasher->HashPassword( $password );
$checked = $pwdHasher->CheckPassword($password, $hash);
$2a$08$sssssssssssssssssssssshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
这意味着您需要验证密码的所有内容都存储在此字符串中
攻击者不能仅使用此字符串并获取原始密码的原因是因为商品的一个重要属性:“生成具有给定哈希的消息是不可行的。”
CheckPassword()
不会返回原始密码。CheckPassword只是检查传入的密码是否与传入的哈希相匹配。如果是,则返回true
,如果不是,则返回false
。你可能想看看这本书。这非常详细地描述了密码哈希的工作原理,尤其是在phpass中。不同的机器不会影响任何东西。为什么机器会影响它?CheckPassword不会返回原始密码。CheckPassword只是检查传入的密码是否与传入的哈希相匹配。如果是,则返回true
,如果不是,则返回false
。该死,我错过了一些明显的东西!compare函数只检查给定密码与散列密码,并返回true或false-您实际上不必访问密码本身。为自己的愚蠢道歉@詹姆斯,bcn,别觉得自己愚蠢。有更多的人不知道答案。你选择问一个问题,而不是仅仅依靠未知。