7

我有一个包含 md5 散列密码的旧系统。我已经测试过这些是正确的,它们不使用盐。

安全.yml

security:
    encoders:
        Namespace\MyBundle\Entity\User:
            algorithm: md5
providers:
    entityUsers:
        entity: { class: NamespaceBundle:User, property: username }

在我的 User 实体中,我实现了 UserInterface 并确保将salt 设置为空字符串

但是在尝试进行身份验证时出现错误的凭据错误。

我尝试将 security.yml 切换为纯文本并输入哈希,系统工作正常。

当然 md5 应该可以工作吗?

4

2 回答 2

25

我遇到了完全相同的问题,不得不深入研究代码以找出原因。

您不需要创建自定义编码器。

默认情况下,Symfony 2.5 中的MessageDigestPasswordEncoder编码器(次,默认情况下,在 Symfony 2.5)中。为了让事情变得更令人兴奋,默认情况下,编码器还将对哈希进行 base64 编码。这两个功能都给我带来了问题。Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder

您可以通过禁用重新散列和/或禁用 base64 编码来解决问题security.yml,因此:

security:
    encoders:
        Namespace\Of\Your\User: 
            algorithm: md5
            encode_as_base64: false
            iterations: 0

希望能节省你一些时间。

于 2014-07-10T15:39:10.983 回答
6

原来symfony2中的md5默认使用salt。可能有更简单的方法,但我刚刚创建了一个忽略盐的自定义 md5 密码编码器接口

注册服务

namespace.project.md5password.encoder:
    class: Namepspace\MyBundle\Services\CustomMd5PasswordEncoder

创建编码器服务

namespace Namespace\MyBundle\Services;

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

class CustomMd5PasswordEncoder implements PasswordEncoderInterface
{
    public function __construct() {
    }

    public function encodePassword($raw, $salt) {
        return md5($raw);
    }

    public function isPasswordValid($encoded, $raw, $salt) {
        return md5($raw) == $encoded;
    }
}

使用 security.yml 中的新服务

security:
    encoders:
        Namespace\MyBundle\Entity\User:
            id: namespace.project.md5password.encoder

希望这可以帮助

于 2013-09-11T10:53:01.713 回答