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

Jon*_*ley 6 php hash symfony

我有一个遗留系统,其中包含md5哈希密码.我测试过这些是正确的,他们不使用盐.

security.yml

security:
    encoders:
        Namespace\MyBundle\Entity\User:
            algorithm: md5
providers:
    entityUsers:
        entity: { class: NamespaceBundle:User, property: username }
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试将security.yml切换到明文并输入哈希,系统工作正常.

当然md5应该有效吗?

Dan*_*n B 23

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

您无需创建自定义编码器.

默认情况下,Symfony 2.5中的MessageDigestPasswordEncoder编码器(Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder) - 可能还有所有Symfony 2版本 - 按预期计算原始密码的MD5哈希值,使用/不使用盐,然后多次重新哈希MD5(5000默认情况下,在Symfony 2.5中.为了使事情更令人兴奋,默认情况下,编码器还将对哈希进行64位编码.这两个功能都给我带来了麻烦.

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

security:
    encoders:
        Namespace\Of\Your\User: 
            algorithm: md5
            encode_as_base64: false
            iterations: 0
Run Code Online (Sandbox Code Playgroud)

希望能为您节省一些时间.


Jon*_*ley 6

事实证明,symfony2中的md5默认使用salt.可能有一种更简单的方法,但我刚创建了一个忽略salt 的自定义md5密码编码器接口.

注册服务

namespace.project.md5password.encoder:
    class: Namepspace\MyBundle\Services\CustomMd5PasswordEncoder
Run Code Online (Sandbox Code Playgroud)

创建编码器服务

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在security.yml中使用新服务

security:
    encoders:
        Namespace\MyBundle\Entity\User:
            id: namespace.project.md5password.encoder
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助