Php 为旧版用户在symfony2 security.yml中使用MD5

Php 为旧版用户在symfony2 security.yml中使用MD5,php,symfony,hash,Php,Symfony,Hash,我有一个包含md5哈希密码的遗留系统。我已经测试了这些是正确的,他们不使用盐 security.yml security: encoders: Namespace\MyBundle\Entity\User: algorithm: md5 providers: entityUsers: entity: { class: NamespaceBundle:User, property: username } security:

我有一个包含md5哈希密码的遗留系统。我已经测试了这些是正确的,他们不使用盐

security.yml

security:
    encoders:
        Namespace\MyBundle\Entity\User:
            algorithm: md5
providers:
    entityUsers:
        entity: { class: NamespaceBundle:User, property: username }
security:
    encoders:
        Namespace\MyBundle\Entity\User:
            id: namespace.project.md5password.encoder
在我的用户实体中,我实现了UserInterface,并确保将salt设置为空字符串

但是我在尝试验证时遇到了一个错误的凭据

我尝试过将security.yml转换为明文,并输入了哈希,系统运行良好


md5肯定会工作吗?

结果表明,symfony2中的md5默认使用salt。可能有一种更简单的方法,但我刚刚创建了一个忽略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;
    }
}
创建编码器服务

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:
            algorithm: md5
providers:
    entityUsers:
        entity: { class: NamespaceBundle:User, property: username }
security:
    encoders:
        Namespace\MyBundle\Entity\User:
            id: namespace.project.md5password.encoder

希望这有帮助

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

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

默认情况下,Symfony 2.5中的
MessageDigestPasswordEncoder
encoder(
Symfony\Component\Security\Core\encoder\MessageDigestPasswordEncoder
)以及可能所有的Symfony 2发行版都会按预期计算原始密码的MD5哈希值(使用/不使用salt),然后对MD5重新哈希多次(默认情况下,在Symfony 2.5中是5000次)。为了让事情变得更加激动人心,编码器在默认情况下也会对哈希进行base64编码。这两个特性都给我带来了问题

您可以通过在
security.yml
中禁用重新哈希和/或禁用base64编码来修复问题,因此:

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

希望这能为您节省一些时间。

如果您的salt为空,默认密码编码器将忽略它。对于密码编码为
md5('password')
的传统用户,在Symfony 3中,这对我来说非常好。此设置使编码器工作起来就像简单的
md5
函数调用一样,这正是我在设置中需要的。