• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar a la barra lateral principal
  • Saltar al pie de página

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Criptografía
  • Python
  • Matlab
  • R
  • Herramientas
  • Tienda

¿Cómo guardar las contraseñas en aplicaciones?

julio 18, 2018 Por Daniel Rodríguez Deja un comentario

A la hora de crear una nueva aplicación multiusuario siempre llega el momento de manejar contraseñas para gestionar el acceso de los usuarios a la misma. En estos momentos llega la pregunta de cómo guardar las contraseñas de una forma que sea segura y confiable para los usuarios. En esta entrada se presentarán algunos de los métodos incorrectos más utilizados y se explicará una forma segura de realizar esta tarea.

Objetivos de la entrada

Antes de continuar es importante acotar el alcance de la entrada. En esta se explicará cómo guardar las contraseñas en aplicaciones multiusuario. En las que el usuario de ha de identificar mediante un par usuario y contraseña. La aplicación solamente necesita saber que la contraseña introducida es la correcta o no. En ningún momento será necesario recuperar la contraseña para utilizar en otro servicio. Es decir, no se va a implementar un llavero sino un control de acceso. En el caso de los llaveros la única forma segura de guardar las contraseñas es encriptando las mismas.

Por otro lado, también es necesario definir que vamos a entender por guardar los datos de forma segura. En esta ocasión entendemos que las contraseñas se almacenan de forma seguirá si un atacante que accede al sistema y obtienen los datos no puede recuperar las contraseñas utilizadas por los usuarios.

Métodos inadecuados para guardar contraseñas

Inicialmente, en esta primera sección se describirán dos métodos inadecuados muy utilizados. Por lo que no han de ser empleados para guardar contraseñas en una aplicación. Concretamente se explicarán porque no utilizar: texto plano y encriptado.

Texto plano

Uno de los métodos más sencillos de implementar es un archivo en el que se guardan los datos en texto plano. Permitiendo la lectura sin problemas de los pares usuario-contraseña. En este caso es fácil comprobar que si un atacante obtiene el archivo obtendrá automáticamente los datos. Esto le permitiría utilizar esta información para acceder a las cuentas de todos los usuarios y suplantar su identidad.

Encriptado

La primera idea después de ver esto es encriptar el archivo. A pesar de utilizar un algoritmo seguro esto no es una buena idea. Un atacante obtendrá un archivo encriptado del que no podrá obtener directamente las contraseñas. Pero posiblemente no sea difícil obtener esta información indirectamente.

A pesar de parecer una buena idea tiene un punto débil. La palabra utilizada para encriptar los datos ha de estar disponible para poder validar las cuentas. En tal caso es altamente probable que el atacante puede obtener esta palabra fácilmente. Buscándola en la base de datos o el código. Permitiéndole así obtener también el listado de las contraseñas.

En el improbable caso de que no obtenga también la palabra, mediante un ataque de fuerza bruta podrá obtener todas las contraseñas. Dificultado solamente un poco su objetivo.

Guardado seguro de contraseñas

Después de ver las técnicas poco recomendables se puede ver otra más fiable. Una que responda a la pregunta cómo guardar contraseñas de forma segura. Un método básico es guardar el código hash en lugar de la contraseña. Es decir, guardar una transformación una transformación de la contraseña. En una entrada anterior se explico algunas de sus propiedades de las funciones hash. Una de las más importantes para lo que nos afecta es que no son reversibles. Por lo que, a partir de un código hash no existe manera directa de obtener el conjunto de datos original.

Así para poder validar usuarios solamente se ha de guardar el nombre de usuarios y el código hash de contraseña. En un entorno así construido, la validación de un usuario no es más complicada que cuando las contraseñas se guardan en texto plano. Simplemente cuando el usuario introduce su par de palabras usuario y contraseña se ha de calcular el código hash de la segunda. En este punto es necesario comprobar si el par de palabras usuario y hash existe. En caso afirmativo se ha validado la identidad del usuario, mientras que en caso negativo se ha de denegar el acceso.

Por lo que, en este escenario un atacante que obtenga el archivo con los pares usuario y hash no puede recuperar directamente las contraseñas. Únicamente puede intentar obtener contraseñas mediante un ataque de fuerza bruta en el que pruebe contraseñas hasta que encuentre alguna que genere alguno de los códigos hash existentes. En este punto la dificultad del ataque depende de las contraseñas utilizadas por los usuarios. Aunque se puede complicar algo mas las cosas como se explica a continuación.

Mejoras a las funciones de hash

Existen dos técnicas que permiten complicar la obtención por fuerza bruta de las contraseñas, agregando a las contraseñas lo que se llama sal y pimienta.

Pimienta y sal

Sal

La complejidad de las contraseñas se puede aumentar utilizando una cadena aleatoria, diferente para cada uno de los usuarios, que se concatena a la contraseña antes de obtener el hash. Así, aunque dos usuarios tengan la misma contraseña, el hash en la base de datos será diferente. Evitando que el atacante pueda realizar un ataque genérico para encontrar las contraseñas de los usuarios, viéndose obligado a realizar un ataque diferente por usuario.

A la hora de guardar las contraseñas se ha de modificar el proceso ligeramente. En lugar de guardar el hash de la contraseña se guardará tanto la sal como en hash de la sal y la contraseña. Los pasos necesarios para validar la contraseña de un usuario al utilizar sal requieren los siguientes pasos:

  1. Solicitar el nombre de usuario y contraseña
  2. Comprobar si el usuario existe, en caso afirmativo obtener la sal y en caso negativo denegar el acceso
  3. General el código hash de código de la sal y la contraseña
  4. Comprobar si el código hash coincide con el almacenado, en caso afirmativo se valida el usuario, en caso negativo se deniega el acceso.

Debido a que el valor de la sal es diferente para cada usuario este se ha de almacenar junto al nombre de usuario y el hash de la contraseña. Aunque el atacante conozca el valor de la sal que se añade a la contraseña no es un problema ya que se ha aumentado la complejidad del ataque necesario para obtener las contraseñas.

Pimienta

Un segundo paso para aumentar la dificultad de los ataques es agregar una segunda cadena aleatoria de un conjunto que se ha generado previamente. Esta es la que se suele llamar pimienta.  Al agregar una segunda cadena un ataque por diccionario ha de probar tantas combinaciones como valores de pimienta exista. Multiplicando el coste de un ataque por fuerza bruta.

El proceso para guardar las contraseñas aumenta en complejidad con este método. Inicialmente se ha de generar un conjunto de pimientas y se han de guardar de forma que sea fácilmente recuperables. Una vez un usuario guarda una contraseña se escoge un valor de la pimienta al azar y se concatena con la contraseña para obtener un código hash. El proceso de validación requiere ahora los siguientes pasos:

  1. Solicitar el nombre de usuario y contraseña
  2. Obtener todos los posibles valores de la pimienta
  3. General el código hash de código hash de la contraseña con todas las pimientas
  4. Comprobar si alguno de los códigos obtenidos coincide con el almacenado, en caso afirmativo se valida el usuario, en caso negativo se deniega el acceso 

Combinación de pimienta y sal

Obviamente, la combinación de los métodos permite obtener un nivel mayor de seguridad que utilizar solamente uno de ellos por separado. Al combinar ambos, generalmente la sal se suele añadir antes de la contraseña y la pimienta después. Calculando los códigos hash de la cadena que se obtenga de concatenar: sal + contraseña + pimienta.

Conclusiones

En esta entrada se ha presentado un método más seguro que la encriptación para guardar las contraseñas de los usuarios a la hora de crear una aplicación. La combinación de las técnicas descritas en esta entrada permite mejorar considerablemente la seguridad de nuestros sistemas.

No te olvides valorar esta entrada

Sin votos
Por favor espera...

Archivado en: Criptografía Etiquetado como: Hash

Entrada anterior: « Archivos JSON con Python: lectura y escritura
Siguiente entrada: Visualización de datos en Python con Seaborn »

Interacciones del lector

Deja un comentario Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones de Analytics Lane.

Contenido relacionado

Barra lateral primaria

Tiendas afiliadas

Realiza tus compras mediante los enlaces y colabora con la web, todo sin coste adicional para ti. También puedes ver nuestra tienda. ¡Gracias!
Aliexpress Amazon Banggood Gearbest

Seguir a Analytics Lane

  • twitter
  • pinterest
  • youtube
  • telegram
  • github
  • rss

Seguir en Feedly

follow us in feedly

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones de Analytics Lane.

Política de Privacidad

Lo mejor valorado

  1. Seleccionar filas y columnas en Pandas con iloc y loc
    Puntuación: 5.0/5. 5 votos.
  2. Unir y combinar dataframes con pandas en Python
    Puntuación: 5.0/5. 5 votos.
  3. Guardar y leer archivos Excel en Python
    Puntuación: 5.0/5. 5 votos.
  4. Eliminar registros duplicados en pandas
    Puntuación: 5.0/5. 5 votos.
  5. Archivos JSON con Python: lectura y escritura
    Puntuación: 4.8/5. 8 votos.

Entradas recientes

  • Truco: ¿cómo se eliminar la salida en una celda de un IPython Notebook? diciembre 13, 2019
  • Numpy básico: como invertir arrays de Numpy diciembre 11, 2019
  • ¿Bajar impuestos para crecer más o crecer más para bajar impuestos? diciembre 9, 2019
  • Copias de seguridad de SQL Server con Microsoft SQL Server Management Studio diciembre 6, 2019
  • Numpy básico: inicializar arrays de Numpy con un valor diciembre 4, 2019

Comentarios recientes

  • Daniel Rodríguez en Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas
  • Axel Caballero en Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas
  • Daniel Rodríguez en Reglas de asociación y market-basket analysis
  • eva en Reglas de asociación y market-basket analysis
  • Daniel Rodríguez en Proteger las funciones escritas en Matlab para su distribución

Etiquetas

Anaconda Analytics Lane App Designer Bases de datos Blockchain CLV Computación cuántica Criptomonedas Deep learning Elecciones Excel Git GUIDE Hash Java Jupyter Libros Machine learning Marketing node numpy pandas Precios RapidMiner scikit-learn seaborn series temporales Small Data Spark SQL Truco Unit testing VirtualBox

Footer

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Noticias
  • Opinión

Programación

  • JavaScript
  • Julia
  • Matlab
  • Python
  • R

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Tienda

Afiliados

  • AliExpress
  • Amazon
  • BangGood
  • GearBest
  • GearVita
  • Geekbuying
  • JoyBuy

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

2018-2019 Analytics Lane · Términos y condiciones · Política de Cookies · Política de Privacidad · Herramientas de privacidad · Contacto