Estoy enamorado de mi GridPanel

I give you my heart

… y no quiero que nadie me lo saque.

Por eso voy a encriptar mis contraseñas

Hace unas semanas, entre los primeros pedidos de Ideas a la carta, estaba el de registro seguro en el Panel de Control. La idea era interesantísima, y nos llevó a meternos en una de las partes más hardcore de la seguridad informática: encriptación.

La Idea

Gustavo proponía era usar SSL, es decir HTTPS, muy conocido porque Hotmail, Gmail, Yahoo! y muchos más lo usan para garantizar la privacidad de sus usuarios al ingresar a sus casillas de mail. HTTPS, sin embargo, no se puede usar en este caso, porque precisa un certificado de validez pago que lo extienden organismos dedicados a eso (como Verisign), y ese certificado se extiende una vez por host. Tenemos muchos hosts :) .

Por una ciudad más segura

¿Cómo hacemos para hacer el login al Grid Panel seguro? Bien, tenemos que encriptar la contraseña antes de mandarla. Googleamos en busca de código libre para poder encriptar con javascript del lado del usuario y después desencriptar con php, usando el algoritmo DES.

busqueda-des.png

Afortunadamente alguien lo había hecho :) .

El algoritmo DES es un algoritmo muy bueno de encriptación simétrica. Por ejemplo, si Ana le quiere mandar un mensaje a Bernardo, puede usar el código que ambos conocen para encriptarlo, después mandárselo, y Bernardo lo desencriptará para leerlo.

El dilema surge cuando no sólo Ana quiere mandarle mensajes a Bernardo, sino que Carolina también. Ana y Bernardo podrían compartir su código con Carolina, pero en ese caso, Carolina podría leer los mensajes de Ana, y al revés. Carolina podría tener su propio código con Bernardo, pero si hubiera más personas, Bernardo empezaría a tener que conocer muchísimos códigos, y se confundiría. Peor aún si la gente que le manda mensajes a Bernardo es mucha y cambia constantemente.

Recordamos entonces la existencia de unos algoritmos muy chulos que funcionan muy distinto que los tradicionales como DES. RSA, DSA y compañía son algoritmos en los que el mensaje se encripta usando un código y se desencripta usando otro distinto. Y no es nada fácil conocer uno sólo sabiendo el otro.

¿Cómo puede ser?

Es por una maravilla de las matemáticas y buena combinación con la computación. Tres científicos (uno por letra) inventaron el RSA, que se basa en la enorme dificultar de factorizar números muy grandes. En definitiva, para romperlo se necesitan siglos de las mejores computadoras del mundo trabajando en conjunto. Lo lamento muchachos, no podemos impedir que sus tataranietos les hackeen el sitio.

Ahora sí que soy un playboy!

2800600.jpg

Bien, bombos y platillos y RSA… ¡Oh! Nos dimos cuenta de un problema. Si Ana encripta su contraseña con nuestra clave pública RSA, nadie la va a poder saber menos el GridPanel. Pero si ella tiene siempre la misma contraseña, y la encripta usando siempre la misma clave, ¡el mensaje resultante es el mismo!

Cualquiera que no sea Ana puede enviar ese mensaje encriptado, y el GridPanel, inocente, va a creer que fue Ana.

Finalmente hicimos esto:

RSAyDES

Rápido y furioso, esto sería:

Cada vez que entrás en la pantalla de login del GridPanel se genera una clave única DES que usamos para encriptar la contraseña. Después encriptamos esa clave única DES con la clave pública RSA. Que es pública, es decir que todos pueden ver y es siempre la misma. Y lo que realmente se manda al loguearse son: la contraseña encriptada en DES y la clave única encriptada en RSA.
Una vez en el servidor, desencriptamos la clave única usando nuestra clave privada RSA, y una vez que hicimos eso, desencriptamos la contraseña.

En definitiva: Encriptamos los datos de forma que viajen seguros por Internet, sin las dificultades de usar SSL.

Una pequeña Odisea

battle_ship_by_radojavor.jpg

Llegó el momento de escribir el código, así que retomamos nuestro diálogo:

Nosotros: ¿Hay código libre de encriptación RSA con javascript y desencriptación RSA con PHP?

Google: NO

Nosotros: ¿Hay código libre de encriptación RSA con javascript?

Google: Sí, acá tenés.

Nosotros: ¿Hay código libre de encriptación/decriptación RSA para PHP?

Google: Más o menos, acá tenés un poco.

Conseguimos una clase Java que hacía la encriptación, la decriptación y la creación de claves. La hicimos compatible con la que bajamos de javascript y la traducimos a php. Tuvimos que estudiar la matemática del RSA (es simple y hermosa). Tuvimos que estudiar un par de funciones de php que nunca se usan. Hicimos potenciaciones con exponentes de 7 dígitos y colgamos varios servidores. Alejandro y Tito (gracias :D !) tuvieron que actualizar fuera de plan la versión y extensiones de PHP5 en la red interna para que dejaramos de colgarla y en todos los servidores del Panel.

Y lo vamos a liberar GPL nosotros.

¡E hicimos un plugin para WordPress con nuestro sistema!

dandy-pink.gif

Si quieren tanto a su WordPress como yo quiero a mi GridPanel, acá está para bajárselo:

Login Encrypt 0.5

La instalación es:

  • Descomprimir
  • Pegar la carpeta login-encrypt en wp-content/plugins
  • Activar en el Tablero de administración de WordPress, en la solapa de Plugins

Pueden generar sus propias claves RSA o poner la suya si ya tienen una.

Lo único: Internet Explorer no va a poder recordar correctamente la contraseña usando este plugin. Tildando la opción “recordarme” en la pantalla de Login, funciona perfecto.

No saben lo que me divertí escribiendo ese plugin :D