2015-12-31 29 views
5

升級到php7後,BCryptPasswordEncoder會引發以下錯誤,例如:在註冊時使用FOSUserBundle標準註冊頁面:FOSUserBundle BCryptPasswordEncoder salting

「的 '鹽' 選項password_hash的使用在C被棄用:\ XAMPP \ htdocs中\ ascentary \廠商\ symfony的\ symfony的\ SRC \的Symfony \組件\安全\核心\編碼器\ BCryptPasswordEncoder.php線81 「在C:\ XAMPP \ htdocs中\ testproject \供應商\貝哈特\貝哈特的\ src \貝哈特\試驗工作\電話\處理器\ RuntimeCallHandler」

我已經跟蹤到這個問題,問題是FOS UserManager類,它調用:

/** 
* {@inheritDoc} 
*/ 
public function updatePassword(UserInterface $user) 
{ 
    if (0 !== strlen($password = $user->getPlainPassword())) { 
     $encoder = $this->getEncoder($user); 
     $user->setPassword($encoder->encodePassword($password, $user->getSalt())); 
     $user->eraseCredentials(); 
    } 
} 

傳遞$ user-> getSalt()會拋出錯誤,因爲在php7中,您不再允許您將自定義salt傳遞給bcrypt encoding/password_hash函數。另外,我看到基地FOS用戶實體的一個問題,因爲在它的構造,鹽設置,如:

$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 

問題:

(1)如何解決我上面張貼的錯誤?也許重寫UserManager,還是有一個由fos提供的解決方案?

(2)如何正確安全的鹽,這是自動生成?

(3)是否需要其他更新,如更新ircmaxell庫?

+0

空[bcrypt是不是一個加密算法(HTTPS ://paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded) –

+1

謝謝,好文章! – user3746259

回答

2

升級到Symfony3。

BCryptPasswordEncoder.php線75:

if ($salt) { 
    // Ignore $salt, the auto-generated one is always the best 
} 
+1

我無法升級,因爲很多其他作曲包依賴於symfony 2.X,比如Sonata項目。大多數軟件包尚未升級到與Symfony3 – user3746259

+0

一起使用。因此,您可以嘗試在用戶實體/文檔中將用戶salt設置爲null。 – malcolm

+0

也想到了,但鹽然後將永遠是空的,我不能保存/再次使用自動生成的一個。參見Nr 2) – user3746259

1

可以設置$鹽屬性是通過重寫FOS \ UserBundle \模型\用戶

namespace YourNamespace\UserBundle\Entity; 

use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="YourNamespace\UserBundle\Repository\UserRepository") 
* @ORM\Table(name="`user`") 
* @ORM\AttributeOverrides({ 
      @ORM\AttributeOverride(
*    name="salt", 
*    [email protected]\Column(name="salt", type="string", nullable=true) 
*   ) 
*  }) 
* 
*/ 
class User extends BaseUser 
{ 

    /** 
    * User constructor. 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->salt = null; 
    } 

    //another codes 
}