Joomla 3.2.1 шифрование паролей
когда пользователь регистрируется на сайте, и я смотрю в базе данных joomla_users в таблице паролей, там хранятся пароли в следующих форматах:
$P$Do8QrURFT1r0NlWf0X / grdF/aMqwqK/
$P$DH38Lch9z508gJiop3A6u0whTity390
- ........
но не в форме, как описано в документации (MD5 +":" + Соль):
- 1802ebc64051d5b4f4d1b408babb5020: 0PHJDbnsyX05YpKbAuLYnw2VCzFMW2VK
Мне нужно прояснить это для меня, потому что я использую внешний скрипт, который проверяет учетные данные пользователя, чтобы проверить соответствие пароля.
в моем PHP-скрипте у меня есть код, который отделяет соль от пароля из базы данных:
$parts = explode( ':', $password_database );
$crypt = $parts[0];
$salt = $parts[1];
но я не могу сделать это, если нет dobule узел (:)
3 ответов
попробуйте это,
следующий фрагмент кода создает стандартный пароль Joomla (более старая версия 1.5,1.7 etc).
jimport('joomla.user.helper');
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword($password_choose, $salt);
$password = $crypt.':'.$salt;
Joomla 3.2+ введен алгоритм пароля PHP bcrypt но это потребовало минимального PHP 5.3+ если вы планируете использовать bcrypt убедитесь, что ваш сервер PHP версия способна для этого,подробнее здесь.
другая версия Joomla с использованием следующие методы (Joomla 3.x)
jimport('joomla.user.helper');
$yourpass = JUserHelper::hashPassword($password_choose);
старый алгоритм также отлично работает в последней версии, только разница в том, что более старая версия создает пароль из 65 символов, а новая создает строку из 34 символов. всегда идите с обновленной версией
также, если вы используете внешний скрипт, должен включать Joomla framework, как показано ниже. Это должно быть в верхней части вашего внешнего файла php
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
также вы упоминалось, что вам нужно проверить учетные данные пользователей, а затем не нужно проверять формат пароля, и все это просто использовать ниже кодов после загрузки фреймворка.
$credentials['username'] = $data['username']; //user entered name
$credentials['password'] = $data['password']; //users entered password
$app = JFactory::getApplication();
$error = $app->login($credentials, $options);
if (!JError::isError($error)) {
// login success
}
else{
//Failed attempt
}
надеюсь, что это помогает..
класс пользователя по умолчанию Joomla больше не использует соленый MD5 для хэширования пароля. Функция bind из JUser
класс теперь называет JUserHelper::hashPassword($array['password'])
зашифровать паролем.
эта функция в настоящее время это:
public static function hashPassword($password)
{
// Use PHPass's portable hashes with a cost of 10.
$phpass = new PasswordHash(10, true);
return $phpass->HashPassword($password);
}
и это означает, что теперь он полагается на PHPass, о котором вы можете прочитать здесь:http://www.openwall.com/phpass/. Основываясь на чтении только вступления этого сайта, я предполагаю, что шифрование теперь bcrypt
вместо MD5, но Joomla возможно, переопределено шифрование по умолчанию.
С ответом Дэвида Фрича я получаю зашифрованный пароль, как это делает Joomla:
<?php
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );
require_once( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
jimport('joomla.user.helper');
$password = "test";
echo "<strong>Password: </strong>" . JUserHelper::hashPassword($password);
?>
обратите внимание, что вы должны сохранить файл в корневом каталоге joomla или изменить JPATH_BASE.