Перенос учетных записей пользователей с Symfony2 на Silverstripe 3

Мне нужна помощь в переносе пользователей с веб-сайта, созданного с использованием Symfony2, на Silverstripe 3.

Я получил таблицу пользователей с веб-сайта, созданного symfony, с хешированными паролями и солями sha1. Я хочу импортировать пользователей на только что настроенный веб-сайт Silverstripe 3. Я попытался вставить образец записи в таблицу участников SS3, вручную вставив хешированный пароль, соль и изменив алгоритм шифрования пароля на sha1, но это не сработало. Я также пытался использовать Security::set_password_encryption_algorithm в моем _config.php, чтобы переопределить шифрование пароля от blowfish до sha1, но, похоже, это не меняет алгоритм пароля.

Мне действительно нужна помощь в этом, так как у меня осталось всего несколько дней, чтобы сдать проект. Любые идеи о том, как мне выполнить миграцию?


person Sktzoootech    schedule 29.12.2012    source источник


Ответы (2)


Шифрование пароля symfony2 шифрует пароль + хеш не только один раз, но и много раз (по умолчанию 5000). Symfony также объединяет пароль и хэш следующим образом:

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

Вам нужно либо воспроизвести эту технику в silverstripe 3, либо использовать шифрование Symfony в вашем приложении Silverstripe 3. Вы можете взглянуть на реализацию, глядя на Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder.

Другим методом может быть сброс каждого пароля и отправка электронного письма каждому пользователю после запуска нового приложения, чтобы пользователь мог добавить свой пароль. В этом случае вам не нужно будет переносить пароль, что может работать лучше в долгосрочной перспективе.

person Sgoettschkes    schedule 29.12.2012
comment
Я смог изменить алгоритм шифрования пароля на sha1, к сожалению, он все еще не работает, потому что symfony использует следующий шаблон $salt.$password, а SS3 использует следующий $password.$salt. Я все еще выясняю, как я могу переключить положение соли и пароля, не взламывая ядро ​​​​SS3. Кстати, спасибо за вклад. - person Sktzoootech; 29.12.2012

Для этого вы можете создать свои собственные классы «шифровальщика» паролей (не на 100% правильное имя...) в SS. Я просмотрел реализация SF2, вот непроверенная отправная точка. Он не проверяет наличие фигурных скобок в солях.

    <?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»).

person Ingo Schommer    schedule 02.01.2013