我只是深入了解Symfony2,并且只是让我自己的用户提供者运行。 ATM我使用brypt,成本为12美元。如果我现在增加成本,bcrypt应该再次刷新密码!?!但是,我如何坚持新的密码到数据库?如果我增加了bcrypt成本,我是否必须重新刷新已经注册的用户密码?
回答
您可以随时更改成本,因为您可以在official symfony2 docs中阅读,因此您不需要重新刷新旧密码,因为它们会自动处理旧费用(并且如果您希望强制用户进入未来可以像在许多大型网站中一样改变他们的密码)。
你知道是否有方法检查密码是否使用当前成本? – David 2014-09-29 14:14:21
我不知道是否有这样的方法,但我认为对你来说更有用的是添加一个方法(可能是事件触发)来强制用户每3/4个月更改一次密码。 – 2014-09-29 15:09:27
所以你有两种选择,您无法扭转的哈希函数:
用户强制插入新的密码或...
更新哈希作为用户再次登录到您的系统(您可以强制启动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和会话,那也可以......变更将发生在超时。没有人会注意到这一变化。
我想你犯了一些错误:1)你检查password_needs_rehash _and_ md5,它不应该是一个_or_而是? 2)当您重新输入密码时,之后做密码验证没有意义,或者您不信任哈希函数? 3)它应该是'password_verify()'而不是password_veryfi。 – martinstoeckli 2016-02-07 19:55:56
1.)如果password_needs_rehash(...,...,...)将返回true,如果它找到差异,并且如果用户提供正确的密码,则md5将返回true。所以我认为这应该没问题。如果我使用“OR”而不是“AND”,即使用户提供了错误的密码,用户仍然可以设置新密码。这是不正确的? 2.)那么我想你可以省略password_veryfi(...,...),如果用户提供正确的md5。但这只是为了确保一切正确,并且数据库中有新的哈希值。你不需要这样做。 3.)更正了错字 – DevWL 2016-02-08 09:18:06
该命令确实有点特别,首先应检查密码是否正确,然后才应检查是否需要重新散列,请参阅[PHP文档]中的示例(http:///php.net/manual/en/function.password-needs-rehash.php)。如果将password_needs_rehash和MD5与_and_组合在一起,您将无法检测到重新散列的未来要求。 – martinstoeckli 2016-02-08 12:40:11
- 1. 我是否必须重新开始?
- 2. 我是否必须生成rebel.xml以重新加载JRebel更改?
- 3. 我是否需要重新注册客户端脚本?
- 4. 注册用户火力并登录,如果已经注册
- 5. 我是否必须删除我用新分配的wchar_t?
- 6. 检测用户是否必须重置密码在Active Directory中
- 7. 我是否必须关闭浏览器才能刷新我的Java小程序?
- 8. 每次我做一个小改动时,我是否必须重新加载app.js?
- 9. 我是否必须使用新证书更新我的应用程序?
- 10. 如果我的静态IP更改,我是否必须重新部署引用WCF的应用程序?
- 11. 我该如何测试一个svn分支是否已经重新集成?
- 12. 我如何验证用户已经注册?
- 13. 寻找域名是否已经注册?
- 14. 检查jQuery“Fancybox”是否已经注册?
- 15. Android DialogFragment:我可以重新使用,还是必须重新使用另一个?
- 16. TinyMCE - 必须刷新页面
- 17. Facebook API - 必须刷新
- 18. 如果MySQL查询返回1个结果,我是否必须指定我想从结果[0]得到密码?
- 19. 是否必须注册下载我的应用的每个设备令牌?
- 20. 如何确定一个dll是否已经用我的C++函数注册过?
- 21. 检查用户名是否已注册
- 22. 更改登录密码后是否必须重新启动mysql服务器?
- 23. 我怎么知道用户是否已经离开了页面?
- 24. 新的注册用户将被重定向到密码重置屏幕
- 25. 我已经失去了Android密钥库文件的密码
- 26. django.template.exceptions.TemplateSyntaxError:'static'不是已注册的标签库。必须是:
- 27. 我们是否必须使用ScrollableResults进行批量更新?
- 28. Ruby 1.9.3如果已经在数据库中创建新用户/密码并重新提示?
- 29. Microsoft.WindowsAzure.Storage更新至V8.2.1.0已经打破了我的代码
- 30. AAD图形API - 检查用户是否必须更改密码
你是否还想自动重新刷新所有现有的用户密码,或强制更新密码,或者只是关闭此密码? – 2014-09-29 09:43:29