Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 随机密码验证的问题_Php_Random_Zend Framework2_Bcrypt - Fatal编程技术网

Php 随机密码验证的问题

Php 随机密码验证的问题,php,random,zend-framework2,bcrypt,Php,Random,Zend Framework2,Bcrypt,我正面临一个让我发疯的问题。给出了以下场景: 应用程序A-管理用户 使用Bcrypt()创建的pw,成本为14 应用程序B-获取用户数据并将其存储在本地数据库中 通过bcrypt()验证的pw,成本14 Bcrypt通过 所以,每当我在应用程序a上创建一个固定密码时,同步它们,应用程序B上的身份验证就会起作用 然而,每当我在应用程序a上创建一个随机密码时,同步它们,应用程序B上的身份验证就无法工作 重定向后,我将通过会话创建的密码传递给前端 $password = (string)

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

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

所以,每当我在应用程序a上创建一个固定密码时,同步它们,应用程序B上的身份验证就会起作用

然而,每当我在应用程序a上创建一个随机密码时,同步它们,应用程序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');
正如你所看到的,这正是我面临的问题所在。每当我使用给定字符串为用户创建新密码时,都不会出现任何问题

但是当我使用未注释部分
$password=(string)rand(29389578)我在前端获取的密码无法进行身份验证

尝试使用
rand()
mt\u rand()
之间没有区别。有人知道这到底是怎么回事吗^^


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

以下是我的代码:

(...)

//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类中的内容

唯一不同的是,除了长度(这不重要)之外,
$password
是随机的还是非随机的,由于某些原因,我看不到对此代码的调用可能会发生两次,为了测试,您应该在设置rand后将其值存储在文件中。这就是你认为的密码。看不出有任何其他原因与你的不匹配expect@LozCherone将密码存储在临时文件中实际上是个好主意,我得试试这个。我真的在这里迷失了自己:D@LozCherone在尝试您的方法时,很明显这与密码的长度有关。只有6个字符或更长的密码才有效。这可能是一个ZF2实现的东西,我将不得不深入研究它!你的主意很好!我创建密码的方法和你一样,我对密码的长度没有问题。我使用\Zend\Math\Rand类而不是本机php Rand,但我已经测试了您的确切代码,它对我很有用。我不是BCrypt的专家,但有一次我遇到了一个叫做向后兼容性的问题。当php版本为5.3.3时,我无法验证用户。也许是这样的…@lluisaznar这是一个非常有趣的观点。我实际上在这里运行5.3.3。。。你能提供你的测试代码吗?正在尝试设置一个测试,并希望确保我们几乎完全相同:)Zend\Math和Zend\Crypt中有两个版本_compare()。这将是一个特定于版本的问题,正式的ZF2现在需要5.3.23,所以我想不会有支持。谢谢你把这个弄明白了!我根本不会想到php版本。