【问题标题】:FOSUserBundle BCryptPasswordEncoder saltingFOSUserBundle BCryptPasswordEncoder 加盐
【发布时间】:2015-12-31 16:55:42
【问题描述】:

升级到 php7 后,BCryptPasswordEncoder 会抛出以下错误,例如关于使用 FOSUserBundle 标准注册页面时的注册:

“在 C:\xampp\htdocs\ascentary 中不推荐使用密码哈希的 'salt' 选项 \vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php 第 81 行 " 在 C:\xampp\htdocs\testproject\vendor\behat\behat\src\Behat\Testwork\Call\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 用户实体中看到了一个问题,因为在它的构造函数中,salt 设置为:

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

问题:

(1) 我上面贴的错误怎么解决?可能覆盖了UserManager,或者fos有没有提供的解决方案?

(2) 如何妥善保护自动生成的盐?

(3) 是否需要任何其他更新,例如更新 ircmaxell 库?

【问题讨论】:

标签: php symfony fosuserbundle bcrypt password-hash


【解决方案1】:

升级到 Symfony3。

BCryptPasswordEncoder.php 第 75 行:

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

【讨论】:

  • 我无法升级,因为很多其他的作曲家包都依赖于 symfony 2.X,比如 Sonata 项目。大多数软件包还没有升级到 Work with symfony3
  • 所以你可以尝试在用户实体/文档中设置用户盐为空。
  • 也想过,但是盐总是为空,我无法保存/再次使用自动生成的盐。见 Nr 2)
  • 来自 Symfony 食谱:“您需要 Salt 属性吗?如果您使用 bcrypt,则不需要。否则,是的。所有密码都必须使用 salt 进行哈希处理,但 bcrypt 在内部执行此操作。由于本教程确实使用 bcrypt,因此 User 中的 getSalt() 方法只能返回 null(未使用)。如果您使用不同的算法,则需要取消注释 User 实体中的 salt 行并添加一个持久的 salt 属性. "
  • 好的,非常感谢!我还有一个想法:当它在这一点崩溃时,它是否也会由于php7而在其他点崩溃?
【解决方案2】:

您可以通过覆盖 FOS\UserBundle\Model\User

将 $salt 属性设置为 null
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",
 *              column=@ORM\Column(name="salt", type="string", nullable=true)
 *          )
 *     })
 *
 */
class User extends BaseUser
{

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

    //another codes
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2010-11-30
    • 2012-11-18
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多