使用sha512编码器和symfony2 in_memory安全提供程序

时间:2014-05-24 18:06:15

标签: security symfony encoding passwords sha512

我正在尝试配置我的symfony2应用程序以将sha512密码编码器与in_memory安全提供程序一起使用,但我无法让它工作。登录时我收到臭名昭着的“Bad credentials”错误。与此处的大多数问题不同,我不想从任何数据库中获取用户。我不想使用FOSUserBundle。我想要的只是用sha512哈希替换我的security.yml中的明文密码。

根据http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password,这应该像设置编码器一样简单,并用哈希替换明文密码,这就是我试图做的事情:

security.yml:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: sha512

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: $6$randomsalt$mbd3sS15ibE.W7hkLqfQ0LNEQsUod7BOUD67g/oIb8uhqGfyAzaga3vgGaRJZn67VdHHfn.tnkKY9ffDVXw3C., roles: [ 'ROLE_ADMIN' ] }

密码为“admin”,盐为“randomsalt”,哈希由mkpasswd生成:

mkpasswd -m sha-512 admin randomsalt

为什么这不起作用? symfony2是否希望散列采用其他格式?

编辑:我也尝试过的事情:

  • 使用crypt($password, "$6$".$salt)
  • 通过PHP生成哈希
  • 在安全编码器上切换encode_as_base64 true / false
  • 指定要使用的迭代次数(默认为5000)

结果相同:“凭证错误”。

2 个答案:

答案 0 :(得分:4)

经过多次试验和错误,我能够工作的唯一配置是最简单的情况:

security:
    encoders:
        Symfony\Component\Security\Core\User\User:
            algorithm: sha512
            encode_as_base64: false
            iterations: 1

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec, roles: [ 'ROLE_ADMIN' ] }

这是由echo -n admin | sha512sum或任何各种在线哈希生成器获得的未加密密码的单个sha512迭代。我无法使用PHP的标准crypt()或password_hash()函数创建的任何东西。文档未指定格式。我的应用程序不以任何其他方式处理用户或密码,我更希望使用symfony的安全组件而无需编写自定义用户实体或密码编码器。对于看似非常基本的东西,这已经变成了大量的工作。

答案 1 :(得分:1)

我找到了一个不优雅但有效的解决方案,并允许任何次数的迭代,而不像接受的答案:

它使用以下类:Symfony \ Component \ Security \ Core \ Encoder \ MessageDigestPasswordEncoder

在任何Controller(或任何php文件)中添加以下代码:

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

...

$messageDigestPasswordEncoder= new MessageDigestPasswordEncoder;
var_dump($messageDigestPasswordEncoder); // you'll see the default options
var_dump($messageDigestPasswordEncoder->encodePassword('Hello', '')); // ouput the encoded password

在security.yml中,添加以下代码:

安全性:

encoders:
    Symfony\Component\Security\Core\User\User: sha512

providers:
    admin:
        memory:
            users:
                # password: Hello
                test:  { password: CYvx/IlZCmwdywJkE8X6FTAixdgaL1oq0u8Ij3o+2LIAyDkWHynQ5UCdWe78YQt5j4oMIIu7YjYYR2b3H7zbvg==, roles: 'ROLE_ADMIN' }