it-swarm.com.ru

joomla шифрование пароля

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

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

4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT

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

как можно создать пароль?

Спасибо.

33
Red

Пароли 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] идентичны, пользователь ввел правильный пароль.

61
klennepette

От 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 как

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

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

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

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

спасибо

23
Er. Anurag Jain

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

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

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

используя рамку по умолчанию Joomla работать так

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();
5
Jobin Jose

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

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

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

root/libraries/phpass/PasswordHash.php

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

$ 2y - это префикс по умолчанию (и предпочтительный) для хешей bcrypt. Что касается кода, вам нужно заглянуть в методы JUserHelper'shashPassword и 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

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

2
Joomler

Из библиотек исходных файлов 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;


    }
}
2
Sam Adamsh

Joomla «понимает» пароли с помощью «обычного» md5.

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

0
jackJoe

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

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

0
itoctopus
<?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 байта

0
user2312578