2014-02-05 92 views
0

問題,我面臨着從字面上我發瘋的問題。下述方案:隨機密碼驗證

  • 應用A - 管理用戶
    • PW使用Bcrypt()創建,耗資14
  • 應用B - 獲取用戶數據,並將其存儲在它裏面的地方分貝
    • PW通過bcrypt()驗證,費用14

Bcrypt實現通過Zend\Crypt\Password\Bcrypt

所以,當我在一個應用程序創建一個固定的密碼,它們同步,在應用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'); 

正如你可以看到那是我面臨麻煩的部分。無論何時我爲給定字符串'123456'的用戶創建新密碼,都不存在任何問題。

但是,當我使用未加註釋部分$password = (string) rand(2938, 9578);我得到我的前端不會驗證密碼。

有與rand()mt_rand()試圖之間沒有差異。任何人都知道這裏發生了什麼? ^^

更新 - 顯然只有6個字符或更長的密碼才能工作。即使我設置了只有4個字母的預定義密碼,它也不起作用。

+1

唯一的區別是除了長度(這並不重要)是'$ password'是隨機的或不是,出於某種原因,我不能看到調用此代碼可能發生兩次,以測試你應該存儲設置後文件中rand的值。所以它的密碼你認爲它是。無法看到任何其他原因,它不會匹配你所期望的 –

+0

@LozCherone將密碼存儲在臨時文件中實際上是一個好主意,必須嘗試一個。我在這裏真的迷失了自己:D – Sam

+0

@LozCherone在嘗試你的方法的時候,很明顯,這與密碼的長度有關。只有密碼6個字符或更長的工作。這可能是一個ZF2的實現方式,我必須深入研究這個!你的想法很好! – Sam

回答

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類。

+0

Zend \ Math和Zend \ Crypt中有幾個version_compare()。這將是一個版本特定的問題,正式ZF2現在需要5.3.23,所以我不會支持我想。非常感謝,因爲我們想出了這個!我根本不會想到php版本。 – Sam