Banner 1

Creando un HASH de ida y vuelta con MD5 en php.

Pongamos un ejemplo: tengo un clásico listado de noticias y su respectivo detalle. En el listado propago el id de la noticia para saber cual levantar en el archivo de detalle (la típica noticias.php?id=1), pero que pasa si quiero proteger la identidad de dicho id? Puedo ofuscarlo pero no sería realmente una protección segura, o lo mejor, puedo hacer de éste un HASH pero no tendría vuelta (recordemos que un HASH no tiene vuelta) y en el caso de ser un id (un simple valor int) puedo usar brutal force para saber cual es el valor nativo con un simple for.
A continuación les mostraré que se puede generar un hash seguro, y no solo eso, sino que lo podré usar para comparar con el id real, aunque lo mejor es que será de manera simple.

No voy a explicar experiencias alternativas que he tenido con esto en este post, voy a ir al grano ejemplificando con php y mysql.
Supongamos que tenemos dos archivos, noticias_listados.php y noticias_detalles.php. En la primera tendré links del estilo:


”>

Todo lo que necesitare para continuar es una key que será un simple string declarado en un variable que tendré en un archivo en común (puede ser el de la conexión a la base de datos):

$key = ‘cu4n70_m4s_c0mpl3j0_m3j05’;

No tiene que ser largo, pero si le podemos poner caracteres especiales como un #o o un &, %, /,;,(,),etc, como si fuera un password nuestro.

Una vez ésto, para imprimir haremos:


”>

Lo que hacemos acá es meter la key que solo nosotros conocemos concatenada del id y generar un HASH usando MD5 (generalmente no dará de 32 caracteres, 16 en modo binario). De ésta manera tendremos en pantalla de nuestro browser algo como:

Esto es una noticia con su id HASEADO

Perfecto, acá ya logramos tener un id totalmente camuflado, y no solo eso, sino que de manera segura!.

Ahora, en el detalle solíamos hacer algo como:

$sql = “Select * from noticias where id = ‘$id’ ”;

Y se preguntaran como hacemos para volver este string de 32 caracteres al valor numérico que necesitamos; y la respuesta es que NO lo haremos, sino que transformaremos del lado de mysql los id en conjunto con nuestra key al momento de comparar. El código es simple:

$sql = “Select * from noticias where MD5(concat(’”.$key.”‘,id)) = ‘$id’”;

Con eso tenemos resulesto nuestro problema, no mostramos más nuestros id y nadie sabe como trabajamos internamente, lo que nos da un poco más de seguridad.

Aclaro que los valores que usamos en los where (variable $id) es una variable seteada previamente con el GET[‘id’] y limpia de malas intenciones, y lo mismo con otras variables como ser por ejemplo $r. Es solo una idea de como implementar este método, cualquier consulta será bienvenida.


Fuente:http://my2bits.wordpress.com/2007/09/19/creando-un-hash-de-ida-y-vuelta-con-md5-en-php/

No hay comentarios:

Powered by Bad Robot
Helped by Blackubay