Мне нужно получить доступ к таблице 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 байтами