0

我需要帮助将用户从使用 Symfony2 构建的网站迁移到 Silverstripe 3。

我从一个 symfony 构建的网站获得了一张用户表,其中包含 sha1 哈希密码和盐。我想将用户导入新设置的 Silverstripe 3 网站。我尝试通过手动插入散列密码、salt 并将密码加密算法更改为,将示例条目插入 SS3s 成员表,sha1但它不起作用。我还尝试使用Security::set_password_encryption_algorithmin my_config.php来覆盖从河豚到的密码加密,sha1但它似乎并没有改变密码算法。

我真的需要这方面的帮助,因为我只剩下几天时间来交付这个项目了。关于我应该如何进行迁移的任何想法?

4

2 回答 2

1

symfony2 密码加密确实对密码 + 哈希进行加密不仅一次而且多次(默认为 5000)。Symfony 还像这样连接密码和哈希:

$password . '{' . $salt . '}'

您需要在 silverstripe 3 中重现这种技术,或者在您的 Silverstripe 3 应用程序中使用 symfony 加密。您可以在查看Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder.

另一种方法是重置每个密码,并在新应用程序上线后向每个用户发送电子邮件,以便用户添加他的密码。在这种情况下,您不需要迁移密码,从长远来看,这可能会更好。

于 2012-12-29T11:58:23.193 回答
0

为此,您可以在 SS 中创建自己的密码“加密器”类(不是 100% 正确命名...)。我看过SF2 implementation,这是一个未经测试的起点。它不检查盐中的花括号。

    <?php
class PasswordEncryptor_Symfony2 extends PasswordEncryptor {
    protected $algorithm = 'sha512';
    protected $iterations = 5000;
    protected $encodeHashAsBase64 = true;
    public function encrypt($password, $salt = null, $member = null) {
        $salted = $password . '{' . $salt . '}';
        $digest = hash($this->algorithm, $salted, true);
        for ($i = 1; $i < $this->iterations; $i++) {
            $digest = hash($this->algorithm, $digest.$salted, true);
        }

        return $this->encodeHashAsBase64 ? base64_encode($digest) : bin2hex($digest);
    }
}

您需要通过 YML 配置在 mysite/_config/encryptors.yml 中注册此类:

PasswordEncryptor:
  encryptors:
    symfony2:
      PasswordEncryptor_Symfony2: 

并将其设置为 mysite/_config.php 中的默认值(如果需要):

Security::set_password_encryption_algorithm('symfony2');

为了确保使用此类检查从 SF2 迁移的现有哈希,您需要将表中的PasswordEncryption列设置Member为“symfony2”(每个成员都有其使用的加密器别名单独设置以允许这些类型的迁移)。因此,在 SS 中创建的任何新用户仍然可以使用默认的 SS 密码散列(“blowfish”别名)。

于 2013-01-02T08:48:05.307 回答