2015-12-31 21 views
5

Dopo un aggiornamento a php7, il BCryptPasswordEncoder genera il seguente errore, ad es. al momento della registrazione quando si utilizza FOSUserBundle pagina di registrazione di serie:FOSUserBundle BCryptPasswordEncoder salatura

"Uso dell'opzione 'sale' a password_hash è deprecato in C: \ xampp \ htdocs \ ascentary \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ linea di sicurezza \ core \ Encoder \ BCryptPasswordEncoder.php 81 "in C:. \ xampp \ htdocs \ TestProject \ vendor \ Behat \ Behat \ src \ Behat \ testwork \ chiamata \ Handler \ RuntimeCallHandler"

I' Ho rintracciato questo problema e il problema è la classe FOS UserManager, che chiama:

/** 
* {@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(); 
    } 
} 

Passando qui $ user-> getSalt() genera l'errore, perché su php7, non è più consentito passare una sessione personalizzata di sale alla funzione bcrypt encoding/password_hash. Inoltre, vedo un problema nell'entità utente fos di base, in quanto nel suo costruttore, il sale è impostato come:

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

Domande:

(1) Come risolvere l'errore che ho postato sopra? Forse sovrascrivendo UserManager o esiste una soluzione fornita da fos?

(2) Come proteggere correttamente il sale, che viene generato automaticamente?

(3) Sono necessari altri aggiornamenti, come l'aggiornamento di ircmaxell lib?

+0

[bcrypt non è un algoritmo di crittografia] (https : //paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded) –

+1

Grazie, bel articolo! – user3746259

risposta

2

Aggiornamento a Symfony3.

BCryptPasswordEncoder.php linea 75:

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

Non riesco ad aggiornare perché molti altri pacchetti di composizione dipendono da symfony 2.X, come il progetto Sonata. La maggior parte dei pacchetti non è ancora stata aggiornata per funzionare con symfony3 – user3746259

+0

Quindi puoi provare a impostare user salt su null nell'entità/documento utente. – malcolm

+0

Ho pensato anche a questo, ma il sale sarebbe sempre stato nullo e non avrei potuto salvare/utilizzare di nuovo quello generato automaticamente. Vedere Nr 2) – user3746259

1

è possibile impostare $ attributo sale è nullo sovrascrivendo FOS \ UserBundle \ modello \ 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 
}