web-dev-qa-db-fra.com

cryptage de mot de passe joomla

J'ai besoin d'accéder à la table utilisateur joomla jos_users pour la vérification de la connexion à partir d'un script php externe [codeignitor].

joomla stocker le mot de passe comme celui-ci

4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT

On dirait que ce n'est pas le MD5 normal, donc je ne peux pas utiliser md5(password).

quel est le moyen possible de créer le mot de passe?

Je vous remercie.

33
Red

Les mots de passe Joomla sont hachés MD5, mais ils sont salés avant d'être hachés . Ils sont stockés dans la base de données sous la forme {hash}:{salt} Ce sel est une chaîne aléatoire de 32 caractères.

Donc, pour créer un nouveau mot de passe hash, vous feriez md5($password.$salt)

MODIFIER

Donc, pour vérifier un mot de passe, supposons qu'un utilisateur myguy entre le mot de passe mypassword, vous récupéreriez la ligne de la base de données portant le nom d'utilisateur myguy.

Dans cette ligne, vous trouverez un mot de passe avec 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT. Vous divisez le mot de passe haché et le sel:

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

calculez maintenant le hachage en utilisant ce sel et le mot de passe myguy entré

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

Maintenant, si ces $userhash et $hashparts[0] sont identiques, l'utilisateur a saisi le mot de passe correct.

61
klennepette

Sur joomla Forum, voici ce qui se passe derrière:

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

Exemple:

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

Vous pouvez trouver le code dans Joomla comme

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

Ou on peut dire

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

Où le sel est une chaîne aléatoire de 32 caractères.

merci

23
Er. Anurag Jain

Dans joomla standard, vous pouvez créer un mot de passe de la manière suivante

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

vous mentionnez que vous accédez à partir d'un fichier externe (ou de programmes), puis si vous avez une installation joomla de l'autre côté, vous pouvez y accéder depuis l'extérieur de la structure de joomla.

en utilisant joomla cadre de travail par défaut comme ça

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

Je ne pouvais pas utiliser preg_split mais explode fonctionnait bien. 

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

Joomla! utilise PhPass.

root/libraries/phpass/PasswordHash.php

regardez ici. vous verrez ici comment le mot de passe est généré.

$ 2y est le préfixe par défaut (et préféré) du hachage bcrypt. En ce qui concerne le code, vous voudrez regarder à l’intérieur des méthodes JUserHelper'shashPassword et verifyPassword pour voir comment Joomla fonctionne avec les choses actuelles.


Quelques références -

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

Vérifiez les liens, j'espère que cela vous sera utile :)

2
Joomler

Les bibliothèques de fichiers sources de joomla/joomla/crypt/password/simple.php peuvent être stockées de différentes manières, et certaines n'ont pas de caractère ':'.

    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 "comprend" les mots de passe avec "normal" md5.

Ce que j’avais fait dans le passé (pour tester la connexion d’un utilisateur), c’était de sauvegarder le mot de passe original, d’en chiffrer un nouveau dans md5, de le remplacer dans la base de données, de le tester avec le navigateur (et cela fonctionne) terminé, collez le mot de passe d'origine dans la base de données.

0
jackJoe

Si vous utilisez simplement md5 ($ password); ça va marcher, essayez-le. Joomla a un mécanisme qui peut fonctionner avec plusieurs types de mots de passe (y compris, récemment, les mots de passe forts). Vous n'avez pas à vous soucier de la partie après le colon. Il suffit d’utiliser md5 ($ password) et cela fonctionnera définitivement.

Au fait, cela fonctionnera également sur 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 parce que bin2hex double la taille des caractères, puisqu'un octet devient deux octets

0
user2312578