8 de julio de 2012

¿Cómo mejorar el "hashing" de las claves de acceso sin molestar al usuario?

Siempre hemos mencionado que definitivamente "No debemos guardar claves de acceso en nuestras bases de datos". Sin embargo la técnica intermedia de guardar el HASH de dichas claves hasta ahora ha sido una solución interesante. Aún así, ya tampoco es muy seguro utilizar esta técnica de forma simple debido a los Ataques por Diccionarios de HASH y los Raibow Tables.

También es necesario acotar se ha demostrado que ciertos tipos de hash como el MD5 presentan conflictos de colisiones, por los cuales los certificados SSL que utilizaban este hash quedaron fuera de circulación debido a que podían ser emulados buscando una colisión específica cualquiera que aunque no representara el certificado original, permitiera emularlo.

Por lo tanto la anterior debilidad del MD5 no solo es válida para los certificados SSL sino para cualquier sistema que lo utilice y por consecuencia para cualquier proceso de validación de clave que se base en este algoritmo. Sin embargo las técnicas de "salting" basadas en agregar una cadena específica a la clave de acceso antes de calcular el hash todavía pueden "salvarle el pellejo" en caso de un ataque, ya que aunque el atacante pueda encontrar un texto que colisione con el md5, este no pasaría la validación ya que al agregarle el "salt key" y calcular el hash este cambiaría nuevamente.

Mi recomendación es que definitivamente no cuente con el md5 en sus desarrollos a futuro y trate de reemplazarlo en los existentes. Sin embargo cuando ya usted posee una gran cantidad de usuarios es difícil cambiar de algoritmo de hashing sin obligarlos a cambiar de clave. Usted no puede cambiar el algoritmo simplemente ya que no posee (al menos no debería) las claves originales sobre las que realizar el cálculo del nuevo hash.

Para esto hay un remedio muy eficiente que se basa en utilizar la técnica de "salting" aplicándola al hash que ya posee y calculando un nuevo hash (preferiblemente no md5) sobre el resultado.  

Ejemplo:
  • Imaginemos que el usuario utilizó una clave como por ejemplo: Hey@you123
  • Usted no conoce dicha clave pero posee el hash MD5 de la misma que es lo que hasta ahora ha utilizado para validar el ingreso del usuario a su sistema: 27f97cb40faf0a16e09dde2a1c2b25b8
  • Agréguele una palabra (salt key) a dicho hash como por ejemplo:  MySaltKey28
  • La cadena resultante sería en este caso:  27f97cb40faf0a16e09dde2a1c2b25b8MySaltKey28
  • Ahora calcule un hash nuevamente con el algoritmo que prefiera (en este caso por ejemplo hemos utilizado SHA1):
    4cd80c13b53a136f62732c6a1e3f88200192edbf
  • Guarde el nuevo resultado en otro campo y deshágase de todo vestigio del viejo hash md5.
Recuerde que cada vez que un usuario quiera validar usted deberá repetir el proceso empezando por calcular el MD5, agregar el "salt key" y calcular el SHA1, aunque esto no debiera ser nada complejo si usted prepara una rutina eficiente que siga los pasos requeridos.

Usted habrá utilizado dos técnicas de hashing que juntas pueden garantizar la seguridad de sus usuarios:  "Hash Salting" e "Interacción entre diferentes tipos de hash". De esta forma si el nuevo hash cayera en manos indebidas ya no podría obtenerse una colisión ni utilizarse un ataque por diccionario.

Usted puede además complicar este proceso tanto como lo desee agregando más interacciones o cálculos recursivos de hash, pero deberá pensar en el tiempo y recursos que podría tomar un cálculo demasiado complejo en relación a la cantidad de usuarios y cantidad de validaciones que requiera.

Hasta la próxima...

Entradas populares