Перевести метод шифрования с 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();
}

Мой вопрос:

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

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

Спасибо,

С

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

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

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

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

успешно

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

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

0

Решение

Главное волшебство здесь в 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.

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector