Перевести метод шифрования с php на python

Итак, я пытаюсь реализовать систему, в которой аутентификация пользователя основана на внешнем sql.

Этот внешний sql есть на моем первом веб-сайте, где у меня много пользователей, и я просто хочу, чтобы они входили в систему с теми же учетными данными.

Пароли, хранящиеся в базе данных, зашифрованы, поэтому мне нужно выяснить метод шифрования. У меня есть полный доступ к сайту, поэтому я нашел этот php-код (сайт основан на php):

/**
 * Generate a password hash
 *
 * @param string $strPassword The unencrypted password
 *
 * @return string The encrypted password
 *
 * @throws \Exception If none of the algorithms is available
 */
public static function hash($strPassword)
{
    if (CRYPT_SHA512 == 1)
    {
        return crypt($strPassword, '$6$' . md5(uniqid(mt_rand(), true)) . '$');
    }
    elseif (CRYPT_SHA256 == 1)
    {
        return crypt($strPassword, '$5$' . md5(uniqid(mt_rand(), true)) . '$');
    }
    elseif (CRYPT_BLOWFISH == 1)
    {
        return crypt($strPassword, '$2a$07$' . md5(uniqid(mt_rand(), true)) . '$');
    }
    else
    {
        throw new \Exception('None of the required crypt() algorithms is available');
    }
}

а также это:

/**
 * Run the controller and parse the password template
 */
public function run()
{
    $this->Template = new BackendTemplate('be_password');

    if (Input::post('FORM_SUBMIT') == 'tl_password')
    {
        $pw = Input::postRaw('password');
        $cnf = Input::postRaw('confirm');

        // The passwords do not match
        if ($pw != $cnf)
        {
            Message::addError($GLOBALS['TL_LANG']['ERR']['passwordMatch']);
        }
        // Password too short
        elseif (utf8_strlen($pw) < Config::get('minPasswordLength'))
        {
            Message::addError(sprintf($GLOBALS['TL_LANG']['ERR']['passwordLength'], Config::get('minPasswordLength')));
        }
        // Password and username are the same
        elseif ($pw == $this->User->username)
        {
            Message::addError($GLOBALS['TL_LANG']['ERR']['passwordName']);
        }
        // Save the data
        else
        {
            // Make sure the password has been changed
            if (crypt($pw, $this->User->password) === $this->User->password)
            {
                Message::addError($GLOBALS['TL_LANG']['MSC']['pw_change']);
            }
            else
            {
                $this->loadDataContainer('tl_user');

                // Trigger the save_callback
                if (is_array($GLOBALS['TL_DCA']['tl_user']['fields']['password']['save_callback']))
                {
                    foreach ($GLOBALS['TL_DCA']['tl_user']['fields']['password']['save_callback'] as $callback)
                    {
                        if (is_array($callback))
                        {
                            $this->import($callback[0]);
                            $pw = $this->$callback[0]->$callback[1]($pw);
                        }
                        elseif (is_callable($callback))
                        {
                            $pw = $callback($pw);
                        }
                    }
                }

                $objUser = UserModel::findByPk($this->User->id);
                $objUser->pwChange = '';
                $objUser->password = Encryption::hash($pw);
                $objUser->save();

                Message::addConfirmation($GLOBALS['TL_LANG']['MSC']['pw_changed']);
                $this->redirect('contao/main.php');
            }
        }

        $this->reload();
    }

У меня вопрос:

как перевести этот метод на питон?

Я не совсем понимаю случайность и как ее повторять. Может, кто-нибудь объяснит?

Спасибо,

C

//редактировать:

Я имею в виду я не понимаю где

return crypt($strPassword, '$6$' . **md5(uniqid(mt_rand(), true))** . '$');

эта средняя часть сохраняется, и поэтому как ее можно сравнить с crypt (пароль, the_same_function (но дает совершенно другое значение);

успешно

Я чувствую, что здесь не хватает чего-то очевидного, может кто-нибудь объяснить? Я знаю, что это просто.

Спасибо еще раз

Я не могу помочь с PHP, но я считаю несправедливым, что кто-то проголосовал против вопроса, не оставив комментария. Получите мой голос

Bruno9779 08.11.2018 16:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная магия здесь в 2 строчках:

тот, который вы упомянули:

return crypt($strPassword, '$6$' . **md5(uniqid(mt_rand(), true))** . '$');

и тот, который проверяет, был ли изменен пароль:

if (crypt($pw, $this->User->password) === $this->User->password)

в первом генерируется соль для пароля, во втором хешированный пароль из базы данных используется для извлечения соли, которая должна использоваться в методе crypt()

Здесь у вас есть дополнительная информация: http://php.net/manual/en/faq.passwords.php#faq.passwords.salt

минус может быть из-за того, что вы сначала не приложили достаточно усилий и (что усложнило мне задачу) вы не поместили код проверки пароля и не поместили свой код Python.

Думаю, теперь у вас достаточно, чтобы написать собственный код. Взгляните на документацию python hashlib https://docs.python.org/3/library/hashlib.html и использование солей.

Я надеюсь, что этого будет достаточно, если вы не опубликуете свой код на Python.

Спасибо, я это понял (ну это прямо здесь).

llaakkss999 09.11.2018 08:45

Другие вопросы по теме