2012-05-03 33 views
31

Necesito acceder a la tabla de usuarios joomla jos_users para la comprobación de inicio de sesión desde script php externo [codeignitor].joomla password encryption

Joomla contraseña de almacenamiento como esto

4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT 

Parece que este no es el MD5 normal, por lo que no se puede utilizar md5(password).

¿Cuál es la forma de crear la contraseña?

Gracias.

+1

pregunta profunda :) y si todavía crees que md5 es la forma normal de almacenar contraseñas, es posible que quieras investigar un poco más sobre ese – mishu

+4

Solo un FYI, MD5 NUNCA se debe usar para contraseñas hash. Nunca. Especialmente sin una sal como en tu ejemplo. – tangrs

+0

Gracias por la información; Pero aquí no estoy a punto de generar un campo de contraseña. – Red

Respuesta

55

Las contraseñas de Joomla son MD5 hash, pero las contraseñas se salan antes de ser hash. Se almacenan en la base de datos como {hash}:{salt} esta sal es una cadena aleatoria de 32 caracteres de longitud.

Así que para crear un nuevo hash de la contraseña que haría md5($password.$salt)

EDITAR

Bueno por lo que para la comprobación de una contraseña, por ejemplo un usuario myguy introduce la contraseña mypassword, podrá recuperar la fila de la base de datos que tiene nombre de usuario myguy.

En esta fila, encontrará una contraseña, por ejemplo 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT. Usted dividir el hash de la contraseña y la sal:

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

ahora calcular el hash usando esta sal y la contraseña myguy entró

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

Ahora bien, si este $userhash y $hashparts[0] son idénticos el usuario ha entrado en el contraseña correcta

+0

¿cómo puedo obtener el '$ salt'? – Red

+3

Para una contraseña existente simplemente tome la cadena después del ':' esa es la sal. Para crear una nueva contraseña, solo genere una cadena aleatoria. Como Er. Anurag Jain declaró en su respuesta que puede hacer esto fácilmente con 'JUserHelper :: genRandomPassword (32)' – klennepette

+0

Lo siento, pero todavía no puedo encontrar la respuesta a la pregunta, supongo que el usuario tiene un pase 'hola', pero ¿cómo sé eso? número aleatorio ? es generado y almacenado en db por JOOMLA .. – Red

0

Joomla "entiende" las contraseñas con md5 "normal".

Lo que he hecho en el pasado (para probar el inicio de sesión de un usuario), era guardar la contraseña original, encriptar una nueva en md5, reemplazarla en la base de datos, probarla con el navegador (y funciona) y cuando terminé, pegue la contraseña original en la base de datos.

+0

Lo siento jackJoe Pero la contraseña de joomla no es un hash md5 normal. Es la combinación de md5 hash y joomla secrete key. –

+0

@ShaikhFarooque Lo sé, estaba dando una sugerencia sobre cómo usar md5 normal para probar una contraseña. – jackJoe

+0

Ya no, no está usando MD5 a partir de la versión 3. – nemesys

22

De joomla Foro, eso es lo que sucede detrás:

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 

Ejemplo:

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 

Puede encontrar el código en Joomla como

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

o podemos decir

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

Donde la sal es aleatoria cadena de 32 caracteres.

gracias

+0

No estoy a punto de registrar un nuevo usuario, necesito obtener la cadena actual en el campo de la contraseña. De modo que pueda coincidir con la contraseña dada por el usuario y la contraseña en el campo de contraseña. – Red

+1

md5 es un hash unidireccional, lo que significa que solo puede cifrarlo pero no revertir el descifrado, no es posible hacerlo. Puede hacer algo que primero busque cadena aleatoria de 32 autos de la contraseña db, y con la ayuda de esa clave de seguridad cree la contraseña de tipo joomla desde la contraseña de entrada y haga coincidir ambos ... –

+0

¿cómo puedo recuperar la cadena aleatoria de la contraseña? ¿Cómo es posible? – Red

5

En estándar de Joomla puede crear una contraseña utilizando la siguiente manera

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

usted menciona que está accediendo desde un archivo externo (o programas) entonces, si usted tiene la instalación de Joomla en el otro lado se puede acceder desde fuera de la estructura joomla.

usando Joomla trabajo de fotogramas predeterminada como esto

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

http://stackoverflow.com/questions/10409432/access-joomla-session -in-php-codeigniter - esta pregunta aún no ha sido respondida :) – Red

3

que no podía usar preg_split pero explode funciona bien.

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

Si solo usa md5 ($ password); Funcionará, pruébalo. Joomla tiene un mecanismo y puede funcionar con múltiples tipos de contraseñas (incluidas, hasta ahora, contraseñas seguras). No tiene que preocuparse por la parte después del colon. Simplemente use md5 ($ password) y definitivamente funcionará.

Por cierto, esto también funcionará en Joomla 3.x.

1

Desde las bibliotecas de archivos fuente de joomla/joomla/crypt/password/simple.php hay varias formas en que se almacenan, y algunas no tienen el carácter ':'.

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

Joomla! usa PhPass.

root/libraries/phpass/PasswordHash.php 

echar un vistazo aquí. Verás aquí cómo se genera la contraseña.

El $ 2y es el valor predeterminado (y preferida) prefijo en bcrypt hashes. En cuanto al código, querrá mirar adentro de los métodos JUserHelper'shashPassword y verifyPassword para ver cómo trabaja Joomla ahora.


Algunos referances -

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

comprobamos los enlaces, espero que lo hará útil :)

+0

parece de joomla v3.2.2 han cambiado a phpass – user889030

0
<?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 porque bin2hex duplica el tamaño del carácter, ya que 1 byte se convierte en 2 bytes