Шифрование паролей joomla

Мне нужно получить доступ к таблице joomla user jos_users для проверки входа с внешнего php-скрипта [codeignitor].

joomla хранит пароль как это

 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT 

Похоже, что это не обычный MD5, поэтому я не могу использовать md5(password) .

Каков возможный способ создания пароля?

Спасибо.

Пароли Joomla MDH хэшируются, но пароли соленые перед тем, как хешировать. Они хранятся в базе данных как {hash}:{salt} эта соль является случайной строкой длиной 32 символа.

Итак, чтобы создать новый хэш пароля, вы будете делать md5($password.$salt)

РЕДАКТИРОВАТЬ

Хорошо, поэтому для проверки пароля, скажем, пользователь myguy вводит пароль mypassword , вы бы myguy строку из базы данных с именем пользователя myguy .

В этой строке вы найдете пароль: 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT . Вы разделили хэш пароля и соль:

 $hashparts = preg_split (':' , $dbpassword); echo $hashparts[0]; //this is the hash 4e9e4bcc5752d6f939aedb42408fd3aa echo $hashparts[1]; //this is the salt 0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT 

теперь вычисляем хэш с использованием этой соли и myguy пароль myguy

 $userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash 

Теперь, если эти $userhash и $hashparts[0] идентичны, пользователь ввел правильный пароль.

Из joomla Forum это происходит позади:

 A. Generate a password B. Generate a string with 32 random characters C. Concatenate Password (Step A) and RandomString (Step B) D. Take md5(Result of Step C) E. store Step D Result : Step B Result 

Пример:

 Generate a password - Let 'testing' Generate a string of 32 random characters - 'aNs1L5PajsIscupUskaNdPenustelsPe' Concatenate Password and random string - testingaNs1L5PajsIscupUskaNdPenustelsPe md5(Step C Result) - 5cf56p85sf15lpyf30c3fd19819p58ly store step d:step B - 5cf56p85sf15lpyf30c3fd19819p58ly:aNs1L5PajsIscupUskaNdPenustelsPe 

Вы можете найти код в Joomla like

 $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword("testing", $salt); $password = $crypt . ':' . $salt; 

Или мы можем сказать

 password DB field = md5(password + salt) + ":" + salt 

Где соль – случайная 32-символьная строка.

благодаря

В стандарте joomla вы можете создать пароль, используя следующий способ

  jimport('joomla.user.helper'); $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($password_choose, $salt); $password = $crypt.':'.$salt; 

вы обращаете внимание на то, что вы получаете доступ к внешнему файлу (или программам), а если у вас есть установка joomla на другой стороне, вы можете получить к нему доступ извне структуры joomla.

используя работу по умолчанию для joomla default this

 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(); 

Я не мог использовать preg_split но explode хорошо работает.

 $hashparts = explode (':' , $dbpassword); 

Из исходных файлов joomla / joomla / crypt / password / simple.php существует несколько способов их хранения, а некоторые не имеют символа ':'.

  switch ($type) { case '$2a$': case JCryptPassword::BLOWFISH: if (JCrypt::hasStrongPasswordSupport()) { $type = '$2y$'; } else { $type = '$2a$'; } $salt = $type . str_pad($this->cost, 2, '0', STR_PAD_LEFT) . '$' . $this->getSalt(22); return crypt($password, $salt); case JCryptPassword::MD5: $salt = $this->getSalt(12); $salt = '$1$' . $salt; return crypt($password, $salt); case JCryptPassword::JOOMLA: $salt = $this->getSalt(32); return md5($password . $salt) . ':' . $salt; } } 

Joomla! использует PhPass .

 root/libraries/phpass/PasswordHash.php 

смотрите здесь. вы увидите здесь, как генерируется пароль.

$ 2y является префиксом по умолчанию (и предпочтительным) для хэшей bcrypt . Что касается кода, вам нужно посмотреть JUserHelper's hashPassword JUserHelper's и verifyPassword методы verifyPassword чтобы увидеть, как Joomla работает с вещами прямо сейчас.


Некоторые референции –

https://github.com/joomla/joomla-cms/blob/3.4.1/libraries/joomla/user/helper.php#L296-L387

https://docs.joomla.org/API15:JUserHelper/getCryptedPassword

https://docs.joomla.org/API15:JUserHelper/getSalt

Проверьте ссылки, надеюсь, вам это поможет 🙂

Joomla «понимает» пароли с «нормальным» md5.

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

Если вы просто используете md5 ($ password); это сработает, попробуйте. У Joomla есть механизм, и он может работать с несколькими типами паролей (в том числе, в конце концов, с сильными паролями). Вам не нужно беспокоиться о части после толстой кишки. Просто используйте md5 ($ password), и это определенно сработает.

Кстати, это также будет работать на Joomla 3.x.

 <?php $r = bin2hex(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)); $p = 'the_password'; $s = $p . $r; $m = md5($s); $out = $m . ':' . $r; echo $out; 

Len 16, потому что bin2hex удваивает размер символа, так как 1 байт становится 2 байтами