Algo muy común entre las aplicaciones prefabricadas más populares (Joomla!, Wordpress, Simple Machines Forum, phpBB) es que las contraseñas de los usuarios se almacenan encriptadas, de forma que si tan sólo se ve la contraseña encriptada es imposible saber qué escribió el usuario antes de ser encriptado.
Hoy pienso explicar cómo encriptar y desencriptar cadenas de texto usando PHP.
Voy a explicar el método para encriptar una misma cadena de texto usando dos formas diferentes y obteniendo resultados diferentes. Hay más métodos, eso seguro, pero por hoy creo que con dos basta.
Base 64
Bien, el primero es Base 64. Para comenzar a meternos un poco en el tema os dejo la definición de Base 64 (extraída de la Wikipedia):
Base 64 es un sistema de numeración posicional que usa 64 como base. Es la mayor potencia de dos que puede ser representada usando únicamente los caracteres imprimibles de ASCII. Esto ha propiciado su uso para codificación de correos electrónicos, PGP y otras aplicaciones. Todas las variantes famosas que se conocen con el nombre de Base64 usan el rango de caracteres A-Z, a-z y 0-9 en este orden para los primeros 62 dígitos, pero los símbolos escogidos para los últimos dos dígitos varían considerablemente de unas a otras. Otros métodos de codificación como UUEncode y las últimas versiones de binhex usan un conjunto diferente de 64 caracteres para representar 6 dígitos binarios, pero éstos nunca son llamados Base64.
Es muy probable que esto no os sirva de mucho por ahora, pero dicen que el saber no ocupa lugar (¿o era la cultura
?).
Dejando de lado las definiciones wikipedicas vamos a pasar a codificar y descodificar. La función de PHP que codifica es base64_encode() mientras que la que descodifica es base64_decode().
Pongamos un ejemplo, imaginemos que queremos codificar “111aaa222″ y una vez codificado mostrarlo en pantalla, usaríamos este código:
<?php
$texto = "111aaa222"; // La contraseña que queremos encriptar
$texto_encriptado = base64_encode($texto); // Creamos una variable que contenga la contraseña encriptadaecho $texto_encriptado; // Mostramos en pantalla la contraseña encriptada
// También podemos usar otras formas, como:
$texto = "111aaa222";
echo base64_encode($texto);
// Otra forma sería:
$texto_encriptado = base64_enconde('111aaa222');
echo $texto_encriptado;
// Por último podemos hacerlo sin usar variables
echo base64_encode('111aaa222');
?>
Cualquiera de las tres formas que aparecen en el código mostrarían en pantalla MTExYWFhMjIy.
Lo dicho, nadie imaginaría que MTExYWFhMjIy es 111aaa222 ¿verdad?
Ahora ya sabemos cómo encriptar códigos, pero ¿y desencriptar? Pues igual que al encriptar sólo que usando base64_decode:
<?php
$texto = "MTExYWFhMjIy";
$texto_desencriptado = base64_decode($texto);
echo $texto_desencriptado;
// Como en el anterior ejemplo, se pueden usar las otras formas
?>
Y bien, creo que con esto es fácil encriptar datos y desencriptarlos en Base 64.
MD5
El segundo método para encriptar contraseñas es MD5, os recuerdo que hay más métodos, pero que no los voy a explicar en este post.
Como con Base 64, comenzaré por una pequeña definición y un poco de historia, de nuevo, extraída de la Wikipedia.
En criptografía, MD5 (acrónimo de Message-Digest Algorithm 5, Algoritmo de Resumen del Mensaje 5) es un algoritmo de reducción criptográfico de 128 bits ampliamente usado.
MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad.
A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash plantea una serie de dudas acerca de su uso futuro.
MD5 presenta un “problema”, no puede ser desencriptado. sin embargo esto no es ningún problema, ya que para comprobar que la contraseña que introduce el usuario es la misma que escribió al registrarse basta con encriptarla también en MD5 y comprobar que el resultado es el mismo.
Ahora pasando a PHP, la función es md5().
Como antes, si queremos encriptar la contraseña 111aaa222:
<?php
$texto = "111aaa222";
$texto_encriptado = md5($texto);
echo $texto_encriptdo;
// Como con base64(), podemos usar la función con otros métodos
?>
Y el resultado es 765f481ac529a1d3415a25e03f4e0de2, como pasaba con Base 64, es imposible saber que tras 765f481ac529a1d3415a25e03f4e0de2 se oculta 111aaa222.
Conclusión
Para finalizar os dejo con una serie de pensamientos sobre ambos métodos:
Base 64 puede ser encriptado y desencriptado, lo que puede ser útil en algunos casos, cuando es necesario saber qué hay tras ese texto encriptado. Sin embargo la posibilidad de desencriptarlo permite que se descubran las contraseñas de los usuarios sin mucha dificultad, está claro que nadie sabe qué hay tras MTExYWFhMjIy a simple vista, pero con un simple script de PHP es muy sencillo saber lo que oculta.
MD5 no puede ser encriptado. Además cualquier cambio (por mínimo que sea) en la cadena de texto original provoca que el resultado encriptado sea totalmente diferente al anterior. Por lo tanto se puede usar para encriptar cualquier dato que no tiene por qué ser desencriptado.
Espero que os resulte útil este post, si tenéis cualquier duda o problema con esto no dudéis en usar los comentarios para preguntar.
Comentarios recientes