我需要有关将用户从使用Symfony2构建的网站迁移到Silverstripe 3的帮助。
我从symfony构建的网站上获得了一个用户表,其中包含sha1哈希密码和盐。我想将用户导入到新设置的Silverstripe 3网站。我尝试通过手动插入哈希密码,盐并将密码加密算法更改为sha1
,将样本条目插入SS3s成员表,但它不起作用。我还尝试在Security::set_password_encryption_algorithm
中使用_config.php
覆盖从河豚到sha1
的密码加密,但似乎没有更改密码算法。
我真的需要帮助,因为我还有几天时间来完成项目。关于如何进行迁移的任何想法?
答案 0 :(得分:1)
symfony2密码加密不仅会对密码+哈希加密一次,而且会加密很多次(默认值为5000)。 Symfony还将密码和哈希连接起来:
$password . '{' . $salt . '}'
您需要在silverstripe 3中重现此技术,或在Silverstripe 3应用程序中使用symfony加密。在查看Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder
时,您可以查看实现。
另一种方法是重置每个密码,并在新应用程序处于活动状态时向每个用户发送电子邮件,以便用户可以添加其密码。在这种情况下,您不需要迁移密码,从长远来看,这可能会更好。
答案 1 :(得分:0)
您可以在SS中为此创建自己的密码“encryptor”类(不是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”别名)。