随机密码验证问题

时间:2014-02-05 13:32:11

标签: php random zend-framework2 bcrypt

我正面临着一个让我疯狂的问题。给出了以下场景:

  • 应用程序A - 管理用户
    • 使用Bcrypt()创建的pw,花费14
  • 应用程序B - 获取用户数据并将其存储在其本地数据库中
    • pw通过bcrypt()验证,费用为14

通过Zend\Crypt\Password\Bcrypt

实施Bcrypt

因此,每当我在App A上创建固定密码,同步它们时,App B上的身份验证就会起作用。

但是,每当我在App A上创建随机密码时,同步它们,App B上的身份验证就不起作用。

我在重定向后将通过会话创建的密码传递给前端。

$password = (string) rand(2938, 9578);
//$password = '12345678';

$bcrypt = new Bcrypt();
$bcrypt->setCost(14);
$entity->setPassword($bcrypt->create($password));

$entityService->save($entity);

$this->flashMessenger()->setNamespace('MpuServerUser')->addSuccessMessage(
    "Benutzer-PIN erfolgreich erneuert. PIN: {$password}"
);
return $this->redirect()->toRoute('mpuserveruser');

正如你所看到的,那是我遇到麻烦的部分。每当我为具有给定字符串'123456'的用户创建新密码时,无论如何都没有问题。

但是当我使用未注释的部分$password = (string) rand(2938, 9578);时,我在前端获得的密码将无法进行身份验证。

尝试rand()mt_rand()之间没有区别。任何人都知道这里发生了什么事吗? ^^

更新 - 显然只有6个字符或更长的密码才能正常工作。即使我设置了只有4个字母的预定义密码,它也无法使用。

1 个答案:

答案 0 :(得分:1)

这是我的代码:

(...)

//I USE ZfcUserAdmin MODULE
if ( $this->getOptions()->getCreateUserAutoPassword() ) {
    //HERE'S WHERE I'VE TRIED
    //\Zend\Math\Rand::getInteger( 2938, 9578 ); --> OK
    //rand( 2938, 9578 ); --> OK
    $rand = \Zend\Math\Rand::getString( 8 );
    $user->setPassword( $rand );
}

$uncrypted_password = $user->getPassword();

$bcrypt = new Bcrypt;

//PASSWORD COST IS SET TO 14, LIKE YOU
$bcrypt->setCost( $userOptions->getPasswordCost() );
$user->setPassword( $bcrypt->create( $uncrypted_password ) );

(...)

您的解决方案与我的解决方案之间的唯一区别是,您在会话中重定向并存储密码,而我只是使用生成的密码向用户发送电子邮件。如果我在电子邮件中使用新凭据,我可以毫无问题地登录。无论如何,我认为这不是问题,我想它应该是 BCrypt 类中的东西。