2015-12-31 3 views
5

После обновления до php7, BCryptPasswordEncoder выдает следующую ошибку, например. о регистрации при использовании FOSUserBundle стандартной страницы регистрации:FOSUserBundle BCryptPasswordEncoder salting

«Использование опции 'соли' в password_hash является устаревшим в C: \ XAMPP \ HTDOCS \ ascentary \ поставщика \ Symfony \ Symfony \ SRC \ Symfony \ Component \ Безопасность \ Основные \ кодировщика \ BCryptPasswordEncoder.php линия 81 "в C:. \ XAMPP \ HTDOCS \ TestProject \ поставщика \ behat \ behat \ SRC \ behat \ Testwork \ Вызов \ Handler \ 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 вам больше не разрешается передавать настраиваемый соль для функции bcrypt encoding/password_hash. Кроме того, я вижу проблему в базовой FOS объекта пользователя, потому что в его конструкторе, соль устанавливается как:

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

Вопросы:

(1) Как решить ошибку я отправил выше? Может быть, переопределить UserManager или есть решение, предоставленное fos?

(2) Как правильно защитить соль, которая автоматически генерируется?

(3) Требуются ли какие-либо другие обновления, такие как обновление ircmaxell lib?

+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

. Таким образом, вы можете попробовать установить значение соли пользователя в null в пользовательском объекте/документе. – malcolm

+0

Также подумал об этом, но тогда соль всегда была бы нулевой, и я не смог бы сохранить/использовать автоматически созданный. См. Nr 2) – user3746259

1

вы можете установить $ атрибут соли нулевым, перекрывая FOS \ UserBundle \ Model \ User

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 
}