2013-02-13 43 views
7

所以我使用新的PHP 5.5密码散列API,我不确定是否正确得到了这个。密码散列API查询

我已经试过自动刷新每个登录,有时我失败,即使哈希结果是相同的反正,我觉得我做错了什么。

它可能是我可能错误的查询函数,因为当我检查phpMyAdmin时哈希值甚至没有改变。

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT)) 
{ 
    $newhash = password_hash(
     $_POST['user_password'], PASSWORD_BCRYPT, 
     ['cost' => 12, 'salt' => 'superfreakingsonicdude',] 
    ); 

    // update hash in database 
    $this->connection->query(
     "UPDATE users SET user_password_hash='" . $newhash . 
     "' WHERE user_name='".$result_row->user_name."'" 
    ); 
} 

Here is where you can find all the functions.

+0

据我所知,你正在检查它是否被“PASSWORD_DEFAULT”散列,如果不是,你将使用'PASSWORD_BCRYPT'保存一个散列。如果它们不相同(例如,如果较新版本的PHP将'PASSWORD_DEFAULT'设置为'PASSWORD_ROT13'),则将永远不会使用'PASSWORD_DEFAULT'对其进行散列处理,因此将重新刷新密码。 – 2013-02-13 07:39:41

+0

(总之,使用'PASSWORD_DEFAULT'或者'PASSWORD_BCRYPT',不要混合它们) – 2013-02-13 07:45:23

+0

我意识到,原来的散列是BCRYPT,所以我确实需要设置它。 主要问题是散列不会改变。 – 2013-02-13 07:56:09

回答

3

输入到哈希是密码和盐。相同的密码,相同的盐,相同的结果。
如果您离开参数salt,每次都会生成一个随机盐,您应该得到不同的结果。你不应该提供静态盐。这意味着所有用户都有相同的盐,这会大大降低其有效性。每个散列 需要 应该有一个随机盐。

+0

但问题是,当我尝试查询重新散列时,我根本没有得到不同的一代。 – 2013-02-13 08:12:46

+0

链接:[这里是你可以找到所有功能的地方。](https://github.com/MrXXIV/PHP-5.5-login/blob/master/app/Login/Classes/login.class.php) – 2013-02-13 08:23:57

4

的funcion password_needs_rehash已被引入到检查是否需要升级:

password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT) 

此功能检查,看是否提供的散列实现所提供的算法和选项。如果不是,则假定散列需要重新映射。

如果您在理解这个函数做什么时有问题,那么RFC包含PHP代码中的函数。所以,如果你可以阅读PHP代码,你应该能够阅读以下(参见引入部分它可以在用户土地来实现:):https://wiki.php.net/rfc/password_hash#password_needs_rehash

有意义的测试,如果在哈希数据库(存储)与PASSWORD_DEFAULT中的算法是否相同。这意味着要检查PASSWORD_DEFAULT是否在上次存储散列和现在散列之间发生了变化。

现在PASSWORD_DEFAULTPASSWORD_BCRYPT所以它应该总是返回false。在你的情况下,它返回true,因为你正在测试没有你的密码选项。

改变这一点,你应该罚款:

$options = ['cost' => 12, 'salt' => 'superfreakingsonicdude',]; 
######## 

if (password_needs_rehash($result_row->user_password_hash, PASSWORD_DEFAULT, $options)) 
                      ######## 
{ 
    $newhash = password_hash($_POST['user_password'], PASSWORD_DEFAULT, $options); 
                 ################ ######## 

    // update hash in database 
    $this->connection->query(
     "UPDATE users SET user_password_hash='" . $newhash . 
      "' WHERE user_name='".$result_row->user_name."'" 
    ); 
} 

还可以考虑继续使用PASSWORD_DEFAULT,如果你想从一个默认的散列在PHP核心算法中更新中受益。

+0

The user_password_hash仍然不会更改。除非..它需要生成盐以便重新散布函数作出反应? – 2013-02-13 08:21:25

+0

'user_password_hash()'返回值不会改变,除非你改变了这三个参数(至少有一个):1)plain(密码),2)* concrete * algo('PASSWORD_DEFAULT'为没有具体的时间)和3)选项。除非没有这些变化,否则哈希将是相同的(顺便说一下,这是散列函数的独特性质)。 – hakre 2013-02-13 08:44:26

+0

啊,好吧!我更希望每次登录的时候都会改变整个hash,只要它仍然可以被读取,但我猜这是没有任何意义的。 – 2013-02-13 08:50:24