Когда пользователь регистрируется на сайте, и я смотрю в базе данных joomla_users в таблице паролей, хранятся пароли в следующих форматах:
$ P $ Do8QrURFT1r0NlWf0X / GrDF / aMqwqK /
$ P $ DH38Lch9z508gJiop3A6u0whTity390
Но не в форме, описанной в документации (MD5 + ":" + SALT):
Мне нужно это разъяснить для меня, потому что я использую внешний скрипт, который проверяет учетные данные пользователя для проверки соответствия пароля.
В моем скрипте PHP у меня есть код, который разделяет SALT из пароля из базы данных:
$parts = explode( ':', $password_database ); $crypt = $parts[0]; $salt = $parts[1];
Но я не могу этого сделать, если нет dobule-узла (:)
Попробуй это,
Следующий фрагмент кода создает стандартный пароль Joomla (более ранняя версия 1.5,1.7 и т . Д.) .
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, как показано ниже. Это должно быть на самом верху вашего внешнего 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 для хеширования пароля. Функция связывания класса 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.