Шифрование паролей joomla
Мне нужно получить доступ к таблице пользователей joomla jos_users
для проверки входа с внешнего PHP скрипт [codeignitor].
joomla, сохраняющий пароль, подобный этому
4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
Похоже, что это не обычный MD5, поэтому я не могу использовать md5(password)
.
Каков возможный способ создания пароля?
Спасибо.
Ответы
Ответ 1
пароли Joomla - хеширование MD5, но пароли соленые перед тем, как быть хэшированными.
Они хранятся в базе данных как {hash}:{salt}
эта соль - случайная строка длиной 32 символа.
Итак, чтобы создать новый хэш пароля, вы сделали бы md5($password.$salt)
ИЗМЕНИТЬ
Хорошо, чтобы проверить пароль, скажем, пользователь myguy
вводит пароль mypassword
, вы должны получить строку из базы данных с именем пользователя myguy
.
В этой строке вы найдете пароль 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
.
Вы разделили хэш пароля и соль:
$hashparts = preg_split (':' , $dbpassword);
echo $hashparts[0]; //this is the hash 4e9e4bcc5752d6f939aedb42408fd3aa
echo $hashparts[1]; //this is the salt 0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
теперь вычислить хеш с использованием этой соли и ввести пароль myguy
$userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash
Теперь, если эти $userhash
и $hashparts[0]
идентичны, пользователь ввел правильный пароль.
Ответ 2
Из форума joomla, что происходит за:
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, например
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword("testing", $salt);
$password = $crypt . ':' . $salt;
Или мы можем сказать
password DB field = md5(password + salt) + ":" + salt
Где соль случайна 32 char строка.
спасибо
Ответ 3
В стандарте joomla вы можете создать пароль, используя следующий способ.
jimport('joomla.user.helper');
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword($password_choose, $salt);
$password = $crypt.':'.$salt;
вы указываете, что вы получаете доступ к внешнему файлу (или программам), а если у вас есть установка joomla с другой стороны, вы можете получить к ней доступ извне структуры joomla.
с использованием работы по умолчанию для joomla default
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();
Ответ 4
Я не мог использовать preg_split
, но explode
работает хорошо.
$hashparts = explode (':' , $dbpassword);
Ответ 5
Joomla! использует PhPass.
root/libraries/phpass/PasswordHash.php
смотрите здесь. вы увидите здесь, как генерируется пароль.
$2y является префиксом по умолчанию (и предпочтительным) в хэшах bcrypt.
Что касается кода, вы захотите заглянуть внутрь методов JUserHelper's
hashPassword
и 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
Проверьте ссылки, надеюсь, вам это поможет:)
Ответ 6
Из исходных файловых библиотек 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;
}
}
Ответ 7
Joomla "понимает" пароли с "нормальным" md5.
То, что я делал в прошлом (для проверки входа пользователя), заключалось в том, чтобы сохранить исходный пароль, зашифровать новый в md5, заменить его в базе данных, протестировать его в браузере (и он работает) и когда я закончил, вставьте исходный пароль в базу данных.
Ответ 8
Если вы просто используете md5 ($ password); это сработает, попробуйте. У Joomla есть механизм, и он может работать с несколькими типами паролей (в том числе, в конце концов, с сильными паролями). Вам не нужно беспокоиться о части после толстой кишки. Просто используйте md5 ($ password), и это определенно сработает.
Кстати, это также будет работать на Joomla 3.x.
Ответ 9
<?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 байтами