Tuesday, May 25, 2010

Ocultar correo con JavaScript

He aquí mi YAJSCHM (Yet Another JavaScript Code for Hide Mail)

<script language="javascript">
<!--
part1 = "4dfCd4O57dfR89dfR0df9E0fdOd";
part2 = "Da6d8Ofq8739MIpN89IsOlo.2COi8urMd34sfv98";
part3 = "correo";
part4 = "aMd2dfAg53gI7Lfd83TdsOf76";
document.write('<a href="'+removeStuffs(part4)+'&#58;' + removeStuffs(part1) + '&#64;' + removeStuffs(part2) + '">');
document.write(part3 + '</a>');

function removeStuffs(string){
pattern = /[a-z\d]/g;
string = string.replace(pattern,"");
return string.toLowerCase();
}
// -->
</script>

Los bonitos colores los tenemos gracias a Online syntax highlighting

Saturday, May 15, 2010

Usuarios y contraseñas en las aplicaciones

Es común que las aplicaciones necesiten conectarse a otros sistemas, llámense bases de datos, web services, etc., normalmente estos sistemas requieren un nombre de usuario y contraseña para poder ocuparlos.
Cuando se quiere automatizar una tarea que necesita conectarse a éste tipo de sistemas, surge una pregunta ¿cómo almacenar el usuario y la contraseña, dentro de la aplicación que funcionará de forma autónoma?
La respuesta lógica es: no en código duro, entonces, esta información debe de estar codificada de alguna forma.

Mi mejor aproximación para resolver esto es la siguiente:

Tener el usuario y la contraseña en un archivo cifrado. Hasta aquí no hay problema, el problema empieza con la pregunta ¿como almaceno la contraseña que descifra el archivo de usuarios y contraseñas? Esto puede convertirse en un problema recursivo, necesito "algo" para asegurar lo que asegura lo que necesito asegurar (¿le entendiste? yo tampoco =P)
Recuerda la típica escena de la película en donde se disponen a abrir la bóveda ultrasegura (en particular recuerdo Terminator 2, cuando van por el brazo del primer terminator [T-800]), para esto antes tuvieron que entrar al edificio, pasar por los diversos guardias, bla bla (algo que de alguna forma deberías considerar en tu aplicación). ¿Que hacen para abrir la bóveda? tienen dos llaves y las cerraduras están en los extremos, de forma que se necesitan dos personas para ponerse de acuerdo e introducir la llave en la cerradura y girarla al mismo tiempo, de otra forma la bóveda no se abrirá.

Hagamos una analogía con lo anterior, el brazo del T-800 (el usuario y la contraseña) esta adentro de la bóveda (el archivo cifrado), ahora necesito dos llaves para poder abrirla.
Primera llave (llave de la cerradura derecha). Tener una función que genere la contraseña con la que se descifra el archivo, esta función debe recibir un parámetro, que es el que ocupara para generar la contraseña. Se me ocurre que esta función puede ocupar una función hash, o algún pseudo generador de números aleatorios, algo que realmente pueda producir una salida totalmente distinta para dos mensajes en los que lo único que cambia es un bit.
char * foo(char *bar);
Segunda llave (llave de la cerradura izquierda). Tener en un archivo el parámetro que se le mandara a la función foo. ¡Y por Mike!, que lo que contenga el archivo sea un valor aleatorio.

De manera que para abrir el archivo cifrado:
1. Se ocupa la llave de la izquierda (el archivo con los parámetros)
2. Se ocupa la llave de la derecha (se le pasan los parámetros a la función foo)
3. ¡Ábrete sésamo!, se desencripta el archivo.

¿Que obtenemos con esto?
- La persona que tenga el código de la aplicación no puede deducir cuál es la contraseña con la que se descifra el archivo.
- Alguien que tenga el archivo de los parámetros, necesita saber que hace la función foo, para poder generar la contraseña.

Para que esto sea completamente análogo a la escena de la película, hace falta algo que aún no tengo solucionado; porque una persona con las dos llaves no sirve, ya que las cerraduras están lo suficientemente separadas para que se necesiten dos personas. ¿Alguna idea? tengo algunas, pero eso ... es otra historia xD.