9 minutos de lectura ( 1720 palabras)

Desmarañando el password de Joomla!.¿Cómo se hace?

Desmarañando el password de Joomla!.¿Cómo se hace?

Seguramente más de una vez te has preguntado “¿cómo crea joomla sus contraseñas?”. Porque hiciste tu propio script de registro en php, porque quieres recuperar una contraseña o simplemente por curiosidad. Aqui lo explico brevemente.

Una de las cosas que como desarrollador te preocupan es que tu aplicación no sea vulnerable. Y hablando de contraseñas es de suponer que a estas alturas no las almacenas en texto plano, ¿cierto? ¡Claro que no! Cualquier desarrollador debería ser capaz de obtener un hash de una contraseña y almacenarlo en su base de datos. Esperemos que así sea.

 

Hay una gran cantidad de formas y protocolos para encriptar contraseñas  (como el conocido MD5 por ejemplo) y por supuesto que Joomla! ha hecho uso de lo más novedoso en el tema.

 

Hasta antes de la versión 3.2 Joomla! creaba sus contraseñas agregando una “Sal” al hasheo (Salted Hashing) y utilizaba dicha sal para comparar la contraseña introducida por el usuario.

 

¿No entiendes ni un comino de lo que hablo, verdad? ¡Vamos! Es fácil. Bueno, la verdad es que yo tampoco lo entiendo así de buenas a primeras, pero si nos vamos con calma será más fácil de entender.

 

El objetivo de este artículo no es darte una cátedra de técnicas de encriptación, pero trataré de que entiendas cómo es que el password se crea en Joomla! y sobre todo cómo puedes reproducirlo en tu propio código PHP. 

 

¿Qué es un hash?

En palabras simples un hash es una función (algoritmo) que acepta una entrada, por lo general una cadena de texto (el password), para generar una especie de batido de caracteres con reglas específicas. Al final, este “batido” nada tiene que ver con la cadena original la cual queda encriptada. Lo interesante del hash es que la cadena de salida siempre debe tener el  mismo largo. 

Intenta esto: Vamos a utilizar md5 para hacer el hash de dos cadenas de texto. Crea un archivo en una carpeta de tu server y llámalo hash.php y pon el siguiente código:

 

<?php
echo md5(‘clave’); //hash a la palabra ‘clave’
echo '<br/>'; //hash a la frase ‘clave de sol’
echo md5('clave de sol');

 

La salida de este archivo es esta:  

 

c27539b378cc7f0a34a92f1f7deb499f

 

bd9541c730bf548ba3a48e3d0c5fe115

 

Como puedes observar, las cadenas resultantes tienen el mismo largo sin importar el largo de la cadena original. Eso es el hashing, pero… 

 

...Joomla 2.5 agrega sal.

 

Seguramente, si eres curioso, habrás visto los passwords de J2.5 (o anterior) y te habrás dado cuenta de que están formados de dos cadenas de caracteres separados por “:” (dos puntos). En Joomla! esta segunda línea de caracteres se agrega como una sal (salt), de manera que, aunque parezca broma, se le agrega sazón al encriptamiento.

 

Básicamente el salt hashing consiste en agregar una cadena de texto aleatoria (llamada salt) a la cadena original, antes de aplicar el hash y guardar en la base de datos ambas cadenas.

 

 

71932574db5729dbdf1ee522f70c644c:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199

 

La cadena anterior representa una cadena salt hashed en Joomla 2.5 o anterior. 

El primer paso es generar una cadena aleatoria de 32 caracteres, la cadena Salt 

Ejemplo.

 

trd7TvKHx6dMeoMmBVxYmg0vuXEA4199

 

El segundo paso es unir el password introducido por el usuario (“secreto” en nuestro caso) con la cadena salt. 

 

secretotrd7TvKHx6dMeoMmBVxYmg0vuXEA4199

 

Después aplicamos el hash (con md5) resultando en esta cadena de caracteres: 

 

71932574db5729dbdf1ee522f70c644c

 

Y almacenar ambas cadenas en la base de datos separadas por “:” (dos puntos) 

 

71932574db5729dbdf1ee522f70c644c:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199

 

Para comprobar que la contraseña introducida por el usuario sea la correcta, se tiene que buscar la cadena completa en la base de datos, descomponerla en dos tomando como referencia los dos puntos, unir la segunda parte de la cadena al password que introdujo el usuario, hacer el hash (md5) y compararla con la primera parte de la cadena.

Si coincide, el password es correcto. 

 

Ahora pasemos lo anterior a php.

 

Utilizando la clase JUserHelper de Joomla lo haríamos así:

 

<?
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword("secreto", $salt);
$password = $crypt . ':' . $salt; //este es el password a almacenar en la Base de datos

 

Por nuestros propios medios así: 

<?php
function cadenaAleatoria($caracteres){
$caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; //posibles caracteres a usar
$numerodeletras=$caracteres; //número de letras para generar el texto
$cadena = ""; //variable para almacenar la cadena generada
for($i=0;$i<$numerodeletras;$i++)
{
$cadena .= substr($caracteres,rand(0,strlen($caracteres)),1); /*Extraemos 1 caracter de los caracteres entre el rango 0 a Numero de letras que tiene la cadena */
}
return $cadena;
}
$cadena=’secreto’;
$salt=cadenaAleatoria(32);
$hash=md5($cadena.$salt);
$password=$hash.”:”.$salt; //este es nuestro password generado.

 

 

Qué tan segura es una contraseña como esta?

Nada es completamente seguro en informática. Sin embargo, este tipo de técnicas aumentan exponencialmente los intentos de descubrir una contraseña en ataques por fuerza bruta. Como se explica en este link de wikipedia: http://es.wikipedia.org/wiki/Sal_(criptograf%C3%ADa)#Ejemplos. 

Si alguna vez has visto algún tutorial para recuperar la contraseña de joomla, verás que la mayoría te dice que entres a la base de datos, edites el campo ‘password’ del usuario e introduzcas una contraseña y la guardes como md5. Es muy importante que después de seguir esos pasos y logres entrar a tu backend, cambies nuevamente tu contraseña. Esto porque cuando lo hiciste manualmente dejaste la cadena Salt vacía.

Como puedes observar, si algún malintencionado llegara a encontrar la forma de leer tu base de datos no le sería tan difícil tomar la cadena password del super usuario, separarla en dos y pasarla por alguno de los muchos desencriptadores md5 que hay en la web para descubrir el password y arruinarte la vida. Aunque no hay porqué alarmarse, pues teniendo buenas prácticas (agregando algunos plugins adicionales de seguridad, protegiendo carpetas mediante htaccess, que tu hosting tenga medidas antihackeo, entre otras) evitaremos la mayoría de estos ataques.

La contraseña no lo es todo en la seguridad. Pero, ¿si esto se pudiera mejorar?…  

 

PhPass y Joomla 3.2

Joomla! 3.2 da unos saltos impresionantes en cuanto a mejorar la seguridad se refiere. Aquí dos artículos de Guillermo Bravo que nos hablan de ello. 

https://magazine.joomla.org/es/ediciones-anteriores/febrero-2014/item/1770-aumentando-la-barrera-de-seguridad

https://magazine.joomla.org/es/ediciones-anteriores/edicion-enero-2014/item/1725-plugin-de-autentificacion-doble

 

En cuanto a la contraseña, Joomla! 3.2 incluye ahora la librería PhPass. 

Todo este asunto de la encriptación de contraseñas resulta demasiado complejo para muchos de nosotros como desarrolladores novatos o medianamente expertos. La mayoría de las veces, cuando desarrollamos, nos apoyamos en Frameworks de desarrollo que nos facilitan muchas tareas. Qué genial sería tener también un framework de contraseñas, fácil de usar y con lo mejor en encriptamiento de contraseñas. Eso es PhPass.

 

 

Portable PHP password hashing framework, Ph Pass para los amigos, fue desarrollado con ese objetivo. Integra un complejo código que de forma automática nos permite hashear nuestras contraseñas utilizando el algoritmo más seguro al que nuestro sistema (combinación de hardware, versión de php, etc) pueda acceder. Es decir, PhPass agotará todas las posibilidades y creará contraseñas encriptadas lo más complejamente posible de acuerdo a las posibilidades de nuestro sistema.

 

Si tenemos una versión de PHP superior a la versión 5.3.1, podemos estar seguros que se utilizará el algoritmo Blowfish, Uno de los más seguros y prácticamente indescifrables que hay. De ahí la importancia de actualizar tu versión de php para las futuras actualizaciones de joomla, como bien lo indica Guillermo en los artículos citados anteriormente.

 

En caso de que nuestro sistema no sea capaz de utilizar Blowfish, irá agotando posibilidades, incluso hasta llegar a utilizar MD5. La idea es hacer el hash lo más seguro posible.

 

Lo mejor es que todo se hace de forma automática y la utilización de PhPass es sumamente sencilla. 

 

 

Tanto en Joomla! 3.2+ como en tus desarrollos independientes, puedes aplicar Phpass de la siguiente forma:  

1. Descarga el Portable PHP password hashing framework( PhPass):

http://www.openwall.com/phpass/

 

2. En tu código deberás incluir una referencia al archivo ‘PasswordHash.php’ y crear tu password encriptado.

En Joomla! 3.2+ la librería se encuentra en la carpeta libraries/phpass/PasswordHash.php por lo que no es necesario realizar la descarga del paso anterior.

 

El  código es el siguiente:

 

<?php
//incluir la librería PhPass
require_once "tusitio/libraries/phpass/PasswordHash.php";  // o la ruta que elijas

//creamos una instancia de la clase PasswordHash
$phpass = new PasswordHash(10, true);

// Generamos el hash
$cadena = 'secreto';
$hash = $phpass->HashPassword($cadena); //este es nuestro password para almacenar en la Base de datos.

 // Comprobación del password

$hash=$valor // valor extraído del campo password de la base de datos correspondiente al usuario que se intenta autenticar.

if ($phpass->CheckPassword('secreto’', $hash)) {
echo "CLAVE CORRECTA";
} else {
echo "CLAVE INCORRECTA";
}
?> 

 

 

Lo mismo hace Joomla!. Observa el archivo libraries/joomla/user/helper.php en la línea 307. Verás la función hashPassword de la clase JUserHelper

 

Utilizando la clase JUserHelper:

 

<?php
$password = JUserHelper::hashPassword($cadena);

 

Lo que interesa aquí es el valor del primer argumento, llamado “costo” (cost) al momento de generar una instancia de la clase PasswordHash. Este argumento nos indica el número de iteraciones del algoritmo que no se qué y que no sé cuánto más…¡ejem! (O.o) No importa. Yo tampoco lo entendí. El punto es que entre más alto sea este número (comprendido entre 4 y 31) más complejo será al hasheo que obtengamos ( y más tiempo y recursos necesitará para llevarse a cabo). Por defecto en Joomla! este valor se fija en 10.

La función HashPassword realizará todo el trabajo… y la función CheckPassword hará el trabajo de verificación. ¡Simple!

Joomla! sigue utilizando la función verifyPassword de la clase JUserHelper para verificar el password, con el plus de que ahora comprueba si se está usando phpass. Si le echas un vistazo al archivo libraries/joomla/user/helper.php línea 333 lo podrás observar.

Genial ¿no? Alguien dijo que “Joomla! está casi muerto”. Con esto queda claro que no es así. Joomla! sigue dando pasos agigantados y se mantiene al día utilizando las tecnologías más recientes para beneficio de sus usuarios. PhPass es un gran salto en este sentido y se debe agradecer.

Espero que este artículo sea útil y como siempre espero sus amables comentarios e ideas. 

Me despido haciendo referencia a Bob Ross: 

Les deseo “Happy Coding”.

0
Algunos consejos para el SEO en Joomla 3.0
Resultado de "Tu extensión favorita" Febrero
 

Comentarios

¿Ya està registrado? Ingresa Aquí
No hay comentarios por el momento. Sé el primero en enviar un comentario.

By accepting you will be accessing a service provided by a third-party external to https://magazine.joomla.org/