【问题标题】:Check Parse.com password manually手动检查 Parse.com 密码
【发布时间】:2014-10-19 03:19:45
【问题描述】:

我正在使用 FOSUserBundle 将 Parse.com 应用程序迁移到 Symfony2 中新开发的平台,该平台使用 sha512 而不是 bcrypt。如果输入的密码是存储在 Parse.com 数据库中的密码,我想用 php 手动检查,这样用户就可以登录,我可以用 sha512 版本替换 bcrypt 存储的密码。有没有办法做到这一点?我有以下代码用于 sha512 验证,并希望做同样的事情,但使用 Parse.com bcrypt 密码:

$salted = $password.'{'.$entity->getSalt().'}';
$digest = hash('sha512', $salted, true);
for ($i = 1; $i < 5000; $i++) {
     $digest = hash('sha512', $digest.$salted, true);
}
if(base64_encode($digest) == $entity->getPassword())
{
     $message = 'OK';
}
else{
     $message = 'Incorrect password.';
}
return $message;

【问题讨论】:

  • 您是在问如何插入自定义密码编码器,还是需要密码编码器本身?
  • 密码编码器本身,找不到也不想泄露当前用户的密码。
  • 反对票很奇怪。这不是一个写得特别好的问题,但它是完全有效的。我真的希望投票者被要求发表评论。
  • 想同样的事情..

标签: php security symfony passwords bcrypt


【解决方案1】:

第一步是插入你自己的密码编码器。

# security.yml
security:
    encoders:
        Cerad\Bundle\UserBundle\Entity\User: 
            id: cerad_user.user_encoder

# services.yml
cerad_user.user_encoder:
    class:  Cerad\Bundle\UserBundle\Security\UserEncoder
    arguments:
        - '%cerad_user_master_password%'

所以现在,安全系统每次要检查用户密码时,都会调用我的UserEncoder

我的 UserEncoder 看起来像:

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;

/* =============================================================
 * Defaults to sha512
 * Then tries legacy md5
 * Also supports master password
 */
class UserEncoder extends MessageDigestPasswordEncoder
{
    public function __construct($master, $algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 5000)
    {
        parent::__construct($algorithm,$encodeHashAsBase64,$iterations);

        $this->master = $master;
    }
    public function isPasswordValid($encoded, $raw, $salt)
    {
        // Master Password
        if ($raw == $this->master) return true;

        // sha12
        if ($this->comparePasswords($encoded, $this->encodePassword($raw, $salt))) return true;

        // Legacy, be nice to force an update
        if ($encoded == md5($raw)) return true;

        // Oops
        return false;
    }

}

我的简单编码器扩展了默认编码器,默认情况下执行 sha512 工作。如果 sha512 失败,那么我们检查 md5 编码。

您会注意到密码编码器无权访问用户对象。它只处理密码。我不清楚你需要做什么才能访问你的“parse.com”数据库。您也许可以插入您自己的用户提供程序 (http://symfony.com/doc/current/cookbook/security/custom_provider.html),它可以在 loadUserByUsername() 方法中检索任何 parse.com 密码。你的问题有点不清楚。

此外,如果您想自动将用户密码更新为 sha12,那么您可能需要添加某种侦听器并为用户设置一个标志。同样,您的问题缺乏细节。但是您可以在处理更新之前让密码编码器工作。

【讨论】:

  • 感谢 Cerad,但我认为这与 FOSUserBundle 不兼容。解释整个过程:我有一个客户端编写了一个 Android 应用程序,该应用程序当前使用 Parse.com 进行数据保存。 Parse.com 使用 bcrypt 作为密码编码算法,所以我有完整的用户列表,他们各自的密码用 Parse.com 算法编码(我在任何地方都找不到)。另一方面,我开发了一个使用 REST 与应用程序通信的 Symfony2 平台。出于登录目的,我使用问题中发布的代码(sha512),但现在我需要一个 bcrypt 版本。
  • 重要的是要注意我想继续使用 sha512,以便它可以与捆绑包兼容,我唯一不想要的是丢失当前密码,因为它们被编码为bcrypt。因此需要将它们从 bcrypt 转换为 sha512。
  • 您无法将编码密码从一种格式转换为另一种格式。编码密码只是一种方式。您所能做的就是等待用户登录,检查输入的密码是否编码为 bcrypt,如果是,则将输入的文本密码加密为 sha512 并将其存储在您的数据库中。 FOSUserBundle 没有进入。
  • 如果您打算继续使用您的 bcrypt 密码,那么这真的很容易。只需插入您自己的 bcrypt 编码器并完全忘记 sha512。同样,虽然 FOSUserBundle 默认为 sha512,但您可以插入任何您想要的插件。甚至可以使用现有的编码器。
  • 是的,你明白了!这就是我想要做的,当用户尝试登录时,我会收到他的用户名和纯密码,我如何检查输入的密码是否编码为 bcrpyt?所以我可以将它与数据库中保存的值进行比较
【解决方案2】:

这就是我要找的东西:

How do you use bcrypt for hashing passwords in PHP?

对于需要同样东西的人来说,第二个 $ 后面的数字是用来散列的成本,在 Parse.com 的例子中是 10。

还是谢谢 Cerad!

【讨论】:

    【解决方案3】:

    这是使用 Symfony2 的完整解决方案。 Downvoters 只是关注第一个人,这是一个有效的问题。

    $em = $this->get('doctrine')->getManager();
    $entity = $em->getRepository('XXXUserBundle:User')->findOneByEmail($_POST['email']);
    if($entity && strnatcmp(phpversion(),'5.5.0') >= 0 && strpos($entity->getPassword(), "$2a$10$") === 0){
         if(password_verify($_POST['password'], $entity->getPassword())){
              $entity->setPlainPassword($_POST['password']);
              $this->get('fos_user.user_manager')->updateUser($entity);
         }
    }
    return new Response('OK');
    

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多