Задать вопрос

Пароли пользователей после переноса с yii?

Добрый день, требуется решить следующую задачу:
Был сайт на yii, за время его существования появилось много активных пользователей которых не хотелось бы терять. Так как сайт долгое время был не какой, пришлось его переписывать но уже на обычном php.
И все бы ничего вся проблема случилось с тем, что пароли пользователей хранятся в зашифрованном хэшэ.
Как на классическом php можно повторить этот алгоритм шифрования пароля, что бы не изменяя паролей, пользователи смогли авторизовываться?
  • Вопрос задан
  • 794 просмотра
Подписаться 5 Оценить 2 комментария
Решения вопроса 2
@xfg
Yii использует алгоритм хеширования blowfish. Чтобы в php получить хеш по этому алгоритму, нужно просто взять функцию crypt и вторым аргументом передать соль в формате$2a$13$6abRKtrd12bvkltrfsorbd

где
$2a$ (также может быть $2x$ или $2y$) - указывает на алгоритм блоуфиш.
13 - сложность алгоритма, может быть от 04 до 31. Чем больше число, тем дольше будет вычисляться хеш.
6abRKtrd12bvkltrfsorbd - 22 символа для соли.

Проверить хеш против пароля можно функцией password_verify. Берете хеши, которые вам нагенерил Yii и передаете в функцию password_verify и всё у вас заработает, без проблем. Я с Yii на node.js уезжал с этими хешами, никаких проблем :)

Все что ниже можно не читать. Там для тех, кому интересно откуда взялось 3 разных префикса ($2a$, $2x$, $2y$).

Префиксы $2y$ и $2x$ существуют только в PHP, так как они налажали в алгоритме блоуфиш в версиях до 5.3.7. Префикс $2x$ был добавлен для обратной совместимости, т.е. если вы генерили хеши $2a$ в версии PHP до 5.3.7 и теперь обновились до или выше этой версии и хотите, чтобы ваши уже существующие уязвимые хеши продолжали правильно работать, то нужно было заменить у таких хешей префикс с $2a$ на $2x$. Префикс $2y$ это уже исправленный алгоритм хеширования и ничем не отличается от $2a$ в версиях PHP 5.3.7 и выше. Подробнее обо всем этом можно прочитать php.net/security/crypt_blowfish.php

Yii использует префикс $2y$. Но в спецификации из всех этих префиксов есть только $2a$ и его и нужно использовать, если у вас версия выше или эквивалентна PHP 5.3.7. Так что, если вы избавились от Yii, то можете поменять и префикс у ваших хешей. Потому что, когда я мигрировал на node.js библиотека для блоуфиш хеширования естественно не поддерживала никаких $2y$ и $2x$ и не собиралась этого делать в дальнейшем, так как это не их баги, а PHP, вот пусть PHP с этими префиксами и живет :)
Ответ написан
Stalker_RED
@Stalker_RED
Открыть исходники, посмотреть как реализованы вот эти методы и повторить их у себя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
В смысле "тихий ужас" по документации?
А по теме, если не в состоянии разобраться с документацией, можно сделать так:
1) Переносите пользователей в новую базу
2) Генерируете новый пароль
3) И далее
а) высылаете новый пароль с рекомендацией сразу же его сменить
б) высылаете ссылку на смену пароля, защищаете токеном
Вот как-то так.
Ответ написан
Immortal_pony
@Immortal_pony
Вам необходимо внедрить в систему алгортитм хэширования пароля из Yii. Посмотреть его можно в исходниках.
public static function hashPassword($password,$cost=13)
{
    self::checkBlowfish();
    $salt=self::generateSalt($cost);
    $hash=crypt($password,$salt);
    if(!is_string($hash) || (function_exists('mb_strlen') ? mb_strlen($hash, '8bit') : strlen($hash))<32)
        throw new CException(Yii::t('yii','Internal error while generating hash.'));
    return $hash;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы