Security 使用带有symfony2 in_内存安全提供程序的sha512编码器

Security 使用带有symfony2 in_内存安全提供程序的sha512编码器,security,symfony,encoding,passwords,sha512,Security,Symfony,Encoding,Passwords,Sha512,我正在尝试将我的symfony2应用程序配置为使用sha512密码编码器和内存安全提供程序,但无法使其工作。我在登录时遇到了臭名昭著的“坏凭证”错误。与这里的大多数问题不同,我不想从任何数据库获取用户。我不想使用FOSUserBundle。我只想用sha512哈希替换security.yml中的明文密码 根据这一点,设置编码器和用散列替换明文密码应该很简单,所以这就是我试图做的: security.yml: security: encoders: Symfony\Comp

我正在尝试将我的symfony2应用程序配置为使用sha512密码编码器和内存安全提供程序,但无法使其工作。我在登录时遇到了臭名昭著的“坏凭证”错误。与这里的大多数问题不同,我不想从任何数据库获取用户。我不想使用FOSUserBundle。我只想用sha512哈希替换security.yml中的明文密码

根据这一点,设置编码器和用散列替换明文密码应该很简单,所以这就是我试图做的:

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”,salt为“randomsalt”,散列由mkpasswd生成:

mkpasswd -m sha-512 admin randomsalt
为什么这不起作用?symfony2是否希望哈希采用其他格式

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

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

结果是一样的:“糟糕的凭据”。

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

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的安全组件,而不编写自定义用户实体或密码编码器。这似乎是一件非常基本的事情,但却变成了一项非常艰巨的工作。

我找到了一个解决方案,该解决方案不优雅,但有效,允许进行任意数量的迭代,而不是公认的答案:

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

在任何控制器(或任何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中,添加以下代码:

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
安全:

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

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

我不太清楚在这种情况下为什么要使用
mkpasswd
?另外,您可能需要使用
php
sha512
函数来生成密码散列,而不是调用
mkpasswd
?我使用mkpasswd作为一种快速生成默认格式散列以进行测试的方法。我也尝试过使用php生成的哈希:
crypt($password,$6.$salt)
(为了代码简洁而编辑的注释)我刚刚阅读了他们使用
sha512
给出的示例。密码在散列之前似乎是用
base64
编码的。这就是散列不起作用的原因。是的,密码+盐连接中的大括号似乎也有问题。那本食谱上写着“你需要做更多的工作”。我放弃了,改为使用bcrypt,按照和的说明使用的ircmaxell/password compat。但它需要PHP>=5.3.7,因此不支持Debian压缩框。我可以接受。谢谢这个答案是可行的,但一定要在散列的周围加上引号,否则当它以数字开头时,yaml可能会将其识别为一个数字。