2014-09-29 54 views
2

我只是深入了解Symfony2,并且只是让我自己的用户提供者运行。 ATM我使用brypt,成本为12美元。如果我现在增加成本,bcrypt应该再次刷新密码!?!但是,我如何坚持新的密码到数据库?如果我增加了bcrypt成本,我是否必须重新刷新已经注册的用户密码?

+0

你是否还想自动重新刷新所有现有的用户密码,或强制更新密码,或者只是关闭此密码? – 2014-09-29 09:43:29

回答

1

您可以随时更改成本,因为您可以在official symfony2 docs中阅读,因此您不需要重新刷新旧密码,因为它们会自动处理旧费用(并且如果您希望强制用户进入未来可以像在许多大型网站中一样改变他们的密码)。

+0

你知道是否有方法检查密码是否使用当前成本? – David 2014-09-29 14:14:21

+0

我不知道是否有这样的方法,但我认为对你来说更有用的是添加一个方法(可能是事件触发)来强制用户每3/4个月更改一次密码。 – 2014-09-29 15:09:27

0

所以你有两种选择,您无法扭转的哈希函数:

  1. 用户强制插入新的密码或...

  2. 更新哈希作为用户再次登录到您的系统(您可以强制启动cookie和允许用户登录的会话,而无需重新输入密码)。该解决方案将允许您的用户使用旧的散列登录,同时您将用新的散列更新旧的散列。下次用户登录时,脚本将使用新版本的散列登录用户。

在这个例子中,我已经使用MD5作为哈希,我想更新与成本= 12 BCRYPT但随时将其更改为任何你所需要的。从BCRYPT成本= 10变为BCRYPT成本= 12也可以工作或任何其他组合。考虑这个例子:

$passwordFromDatabase = "0d107d09f5bbe40cade3de5c71e9e9b7"; // md5 hash of "letmein" 
$passwordFromForm = $_POST['password']; // $_POST['password'] == "letmein" 

if(password_needs_rehash($passwordFromDatabase, PASSWORD_BCRYPT, ["cost" => 12]) && md5($passwordFromForm) === $passwordFromDatabase){ 
    // generate new password 
    $newPasswordHash = password_hash($passwordFromForm, PASSWORD_BCRYPT, ["cost" => 12]); 
    // update hash from databse - replace old hash $passwordFromDatabase with new hash $newPasswordHash 
    // after update login user 
    if(password_verify($passwordFromForm, $newPasswordHash)){ 
     // user has logged in successfully and hash was updated 
     // redirect to user area 
    }else{ 
     // ups something went wrong Exception 
    } 
}else{ 
    if(password_verify($passwordFromForm, $passwordFromDatabase)){ 
     // user password hash from database is already BCRYPTed no need to rehash 
     // user has logged in successfully 
     // redirect to user area 
    }else{ 
     // wrong password 
     // no access granted - stay where you are 
    } 
} 

我更喜欢第二个选项:)。做出自己的选择。如果您选择第二个选项,并选择不踢出允许用户在未提供密码的情况下登录的cookie和会话,那也可以......变更将发生在超时。没有人会注意到这一变化。

+0

我想你犯了一些错误:1)你检查password_needs_rehash _and_ md5,它不应该是一个_or_而是? 2)当您重新输入密码时,之后做密码验证没有意义,或者您不信任哈希函数? 3)它应该是'password_verify()'而不是password_veryfi。 – martinstoeckli 2016-02-07 19:55:56

+0

1.)如果password_needs_rehash(...,...,...)将返回true,如果它找到差异,并且如果用户提供正确的密码,则md5将返回true。所以我认为这应该没问题。如果我使用“OR”而不是“AND”,即使用户提供了错误的密码,用户仍然可以设置新密码。这是不正确的? 2.)那么我想你可以省略password_veryfi(...,...),如果用户提供正确的md5。但这只是为了确保一切正确,并且数据库中有新的哈希值。你不需要这样做。 3.)更正了错字 – DevWL 2016-02-08 09:18:06

+0

该命令确实有点特别,首先应检查密码是否正确,然后才应检查是否需要重新散列,请参阅[PHP文档]中的示例(http:///php.net/manual/en/function.password-needs-rehash.php)。如果将password_needs_rehash和MD5与_and_组合在一起,您将无法检测到重新散列的未来要求。 – martinstoeckli 2016-02-08 12:40:11

相关问题