Sie sind auf Seite 1von 4

Autenticacin segura usando Ajax

Escrito por edgaragg Martes, 14 de Abril de 2009 10:26 - Actualizado Martes, 14 de Abril de 2009 15:07

Los ultimos das he estado dedicado a investigar un poco acerca de un problema que a estado dando vueltas en mi cabeza. Hace un tiempo apareci una noticia acerca de un nuevo ataque que hace al protocolo SSL inseguro. Especificamente en Black Hat 2009 , se public la herramienta SSLStrip que permite realizar un ataque de tipo "man in the middle" engaando al usuario para hacerlo creer que se encuentra en un sitio de Internet con cifrado SSL (HTTPS). En realidad tus datos se estn transmitiendo sin cifrado alguno (HTTP), pero la cosa no para ah, SSLStrip tambin permite engaar el servidor HTTP, hacindolo pensar que el cifrado ha sido anulado pero en realidad el sitio sigue como si todava utilizara SSL.

Si esto es as, resultara realmente fcil obtener las contraseas de cualquier sitio web. Entonces cmo podemos protegernos?

Investigando un poco he dado con una solucin que si bien no es perfecta me parece que es lo suficientemente segura para ser incluso usada sin necesidad de SSL. La solucin est basada en el uso de autenticacin por desafio/respuesta y mi propuesta se usa en combinacin con AJAX para el intercambio de informacin con el servidor.

En primer lugar voy a explicar en que consiste la autenticacin por desafo/respuesta y posteriormente pasar a dar una explicacin del algoritmo propuesto, as como algunas recomendaciones que tomo en cuenta actualmente para proveer de mayor seguridad el proceso de autenticacin.

Qu es la autenticacin por desafo/respuesta?


La autenticacin por desafo/respuesta (CRA por sus siglas en ingls) es un mtodo que permite prover la identidad de un usuario a travs de un medio inseguro sin revelar informacin sensible que pueda ser usada por usuarios malintencionados para impersonar la identidad de otros usuarios.

Este mtodo hace uso de los algoritmos de encriptamiento de una sola va o de hash, como por ejemplo MD5, SHA-1 o SHA-512 y funciona de la siguiente manera:

1/4

Autenticacin segura usando Ajax


Escrito por edgaragg Martes, 14 de Abril de 2009 10:26 - Actualizado Martes, 14 de Abril de 2009 15:07

Supongamos que tenemos una funcin de hash h(), cuando el cliente se conecta al servidor, este genera un valor X de forma aleatora conocida como el desafo. Este desafo es enviado al cliente. Cuando el cliente tiene el valor de X calcula h(P+X) donde P es el password o contrasea y + es la concatenacin de cadenas. Este valor es la respuesta al desafo y se enva al servidor junto con el nombre de usuario. Luego el servidor calcula de nuevo el valor h(P+X) para el nombre de usuario enviado y lo compara con el valor que envi el cliente, si coinciden entonces el usuario queda autenticado.

Como puede verse la contrasea nunca es enviada al servidor, en su lugar se envia un valor encriptado en una sola va, por lo que la nica forma de obtener la contrasea es usando fuerza bruta. La otra ventaja es que el valor encriptado solo es valida para esa sesin puesto que si el mismo usuario intenta autenticarse posteriormente en otra sesin, se generara otro desafo y como resultado se obtendra otra resuesta.

Algoritmo propuesto.
En primer lugar debo indicar que actualmente no acostumbro a almacenar la contrasea de ningn usuario como texto plano. En su lugar la contrasea del usuario es almacenada usando un algoritmo de hash en combinacin con un valor aleatorio generado al momento del registro del usuario conocido como salt. Esto provee una seguridad extra puesto que hace practicamente imposible obtener la contrasea de los usuarios si por alguna razn un atacante obtiene acceso al servidor (y especificamente a la tabla de usuarios en la base de datos)

De esta manera el pseudo-algoritmo indicado en el apartado anterior se ve modificado para aceptar el uso del valor salt.

El algoritmo de autenticacin sera el siguiente: 1. Una vez que el usuario llena el formulario de autenticacin y presiona el botn para hacer login, se hace una llamada usando ajax enviando unicamente el nombre del usuario. 2. El servidor valida la existencia del usuario, en caso de que el usuario exista se crea un valor aleatorio (el desafo) y se enva al cliente conjuntamente con el valor salt del usuario, el cual ser usado para obtener el valor de la contrasea encriptada en el servidor. El valor del desafo se almacena en sesin. 3. El cliente obtiene el valor de la contrasea encriptada, primero concatenando el valor del

2/4

Autenticacin segura usando Ajax


Escrito por edgaragg Martes, 14 de Abril de 2009 10:26 - Actualizado Martes, 14 de Abril de 2009 15:07

salt y posteriormente aplicandole la funcin de hash. En otras palabras: Contrasea encriptada = h(contrasea + salt) 4. Se concatena el valor del desafo con la contrasea encriptada, obteniendose as el valor de la respuesta al desafo. En otras palabras: Respuesta desafo = h(contrasea encriptada + desafo) 5. La respuesta es enviada al servidor en conjunto con el nombre de usuario usando otra llamada ajax. 6. El servidor calcula la respuesta al desafo de forma similar al paso 4, con la diferencia de que la contrasea encriptada es la almacenada en la base de datos para ese usuario. 7. El servidor compara el valor de la respuesta calculado con el enviado por el cliente. Si coinciden entonces el cliente conoce la contrasea del usuario y por lo tanto el mismo esta autenticado. En caso contrario la autenticacin falla. En el paso 5 no es 100% necesario efectuar otra llamada ajax, podra hacerse un Post de un formulario, pero en este caso hay que asegurarse (usando JScript) que se enve la respuesta del desafio y se evite enviar la contrasea en claro. Lo que si es importante es hacer la llamada Ajax en el paso 1 con la intencin de obtener el valor del salt y el desafo.

Registro de usuario seguro


Ahora tenemos un proceso de autenticacin en principio segura, sin embargo, no es el nico lugar en la aplicacin donde un usuario puede enviar una contrasea como texto a travs de la red. Esto puede pasar tambin en el momento del registro, por lo que este proceso tambin debe llevarse a cabo de forma segura. A continuacin presento un algoritmo para llevar a cabo el registro del usuario de forma segura, este proceso debe hacerse de una forma muy similar para el caso de cambio de contrasea: 1. El cliente llena los datos de registro y presiona el botn para registrar. Al hacer clic sobre dicho botn se hace una llamada ajax al servidor enviando como parmetro unicamente el nombre de usuario (Puede enviarse tambin el correo electrnico si se desea validar que el correo sea nico) 2. El servidor valida que el nombre de usuario no este repetido. (tambien verifica el correo si este fu enviado) Si no est repetido se genera un cdigo aleatorio que ser el salt y se enva al cliente. 3. El cliente encripta la contrasea concatenandola con el salt y aplicandole posteriormente la funcin de hash. En otras palabras:

3/4

Autenticacin segura usando Ajax


Escrito por edgaragg Martes, 14 de Abril de 2009 10:26 - Actualizado Martes, 14 de Abril de 2009 15:07

Contrasea encriptada = h(contrasea + salt) 4. Se enva la contrasea encriptada al servidor junto con los otros datos del registro haciendo otra llamada ajax. 5. El servidor almacena los datos del usuario junto con la contrasea encriptada. En este caso, en el paso 4 se puede cambiar la llamada ajax por un post de un formulario. De ser as, hay que asegurarse de enviar la contrasea encriptada en lugar de la contrasea en texto plano.

Cmo encriptar en el cliente? El ltimo obstaculo que debemos superar es como hacer la encriptacin en el cliente. Es recomendable usar un algoritmo de encriptacin reconocido como MD5 o SHA1, SHA256 o SHA512 en lugar de implementar uno por cuenta propia.

Como la encriptacin se debe llevar a cabo del lado del cliente hay que usar Javascript para llevarla a cabo. Se puede conseguir la implementacin de los algoritmos en Internet. Aqui hay algunos enlaces donde se pueden conseguir:

Implementacin de SHA-256, SHA-384 y SHA-512

Implementacin de MD5 y SHA-1

Las implementaciones de MD5 y SHA-1 tambien posee funciones para aplicar el mecanismo de HMAC, el cual es bastante seguro y puede ser usado en una variacin de los algoritmos propuestos anteriormente.

4/4

Das könnte Ihnen auch gefallen