Я хочу показать расшифрованный пароль в форме обновления в виде строки

<?= $form->field($model, 'password_hash')->passwordInput() ?>

Показать полный зашифрованный пароль, например:

$2y$13$4SUKFKV03ZolfDwLIsZRBuD4i7iELPZRMEJojODgP3s5S4dER.J0m

Это зашифрованный пароль для 123456

2
Jsparo30 26 Фев 2016 в 23:09

2 ответа

Лучший ответ

Как уже упоминал @TomCarrick, хеширование паролей - это односторонний алгоритм, который никогда не должен быть отменен. Процесс проверки действительности предлагаемого пароля заключается в его хешировании с использованием того же алгоритма, а затем проверке того, совпадает ли полученный хэш с тем, который у вас уже есть. Эта стратегия обрабатывается в Yii в рамках класса пользователей, расширение IdentityInterface и определенное в вашем файле конфигурации. И это делается двумя способами:

class User extends ActiveRecord implements IdentityInterface
{
    ...

    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }

    public function setPassword($password)
    {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

ПРИМЕЧАНИЕ. Не рекомендуется следующее. Если это для формы обновления, например, для изменения пароля пользователем, как я понял из вашего вопроса, я бы рекомендуют использовать два входа: old_password и new_password как используется на большинстве веб-сайтов. Затем так же, как реализовано в классе User, вы можете проверить действительность предполагаемого пароля, сравнив хеши и он действителен, тогда вы просто хешируете new_password и сохраняете его в базу данных, заменив старую.

Если по каким-либо причинам вам необходимо знать пароли пользователей, вам нужно будет вручную изменить способ, которым Yii устанавливает и проверяет эти пароли, реализуя стратегию МЕНЬШЕ БЕЗОПАСНОСТИ , и этого можно достичь, заменив этот односторонний алгоритм другим, например с использованием encryptByPassword () и decryptByPassword () вспомогательные методы, которые позволят вам зашифровать любую строку с помощью $secretKey, который вы будете использовать позже, чтобы расшифровать ее обратно. Таким образом, вам нужно будет переопределить ранее упомянутые 2 метода следующим образом:

public $secretKey = 'WHATEVER_SECRET_YOU_CHOOSE';

public function validatePassword($password)
{
    $decryptedPassword = Yii::$app->getSecurity()->decryptByPassword($this->password_hash, $this->secretKey);
    return $decryptedPassword === $password;
}

public function setPassword($password)
{
    $this->password_hash = Yii::$app->getSecurity()->encryptByPassword($password, $this->secretKey);
}

При необходимости вы также можете реализовать методы установки и получения внутри своей модели , например:

public function getPassword()
{
    return Yii::$app->getSecurity()->decryptByPassword($this->password_hash, 'THE_SECRET_YOU_ALREADY_HAVE_CHOOSEN');
}

public function setPassword($password)
{
    $this->password_hash = Yii::$app->getSecurity()->encryptByPassword($password, 'THE_SECRET_YOU_ALREADY_HAVE_CHOOSEN');
}

Что вы можете использовать где угодно, чтобы получить настоящий пароль и, по крайней мере, сохранить его расшифрованную версию в базе данных:

<?= $form->field($model, 'password')->passwordInput() ?>

Вы также можете найти дополнительную информацию о вспомогательных методах безопасности здесь.

2
Salem Ouerdani 26 Фев 2016 в 22:29

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

2
Tom Carrick 26 Фев 2016 в 20:12