Cómo almacenar contraseñas seguras en PHP

Una vez más, en este post voy a hablar sobre la seguridad en la red. En este caso, voy a centrarme en uno de los grandes objetivos de los desarrolladores: evitar que las contraseñas de los usuarios se vean comprometidas.

Como ya hemos hablado en artículos anteriores, existen infinidad de herramientas o métodos para conseguir vulnerar los sistemas (como la Ingeniería social). El trabajo conjunto del binomio desarrollador-usuario resulta crucial para poner más difícil a los hackers conseguir su objetivo. Por parte de los usuarios, empleando contraseñas seguras y, por parte de los programadores, utilizando técnicas seguras de cifrado de contraseñas o incluyendo más capas de seguridad como Latch.

Cabe decir que. con los últimos avances tecnológicos, resulta casi imposible mantener un sistema totalmente seguro durante mucho tiempo. En la gran mayoría de ataques el objetivo principal es apropiarse de la o las bases de datos para vulnerar un sistema, robo de identidades, spam, etc.  Todo el mundo sabe que el dato más valioso en un sistema son las contraseñas; por tanto, almacenarlas de forma segura es vital para que, aunque consigan la base de datos, no las puedan descifrar.

Encriptar contraseñas

Uno de los métodos más seguros y extendidos en el desarrollo de aplicaciones es almacenar las contraseñas encriptadas. Para ello, existen funciones creadas con el objetivo de transformar cualquier cadena de datos en otra totalmente diferente. Son las llamadas funciones criptográficas hash o más conocidas como “hash“.

El  “hasheo” de datos consiste en aplicar un algoritmo a una cadena de entrada para obtener una nueva de longitud fija. Es decir, sea cual sea la longitud de entrada, la función devolverá una serie de la misma longitud.

Las funciones hash más conocidas en el desarrollo se software son MD5 y SHA1. La primera devuelve una cadena de 32 caracteres y a segunda de 40. No obstante, los algoritmos empleados en ellos se han quedado obsoletos y ya no son seguros, ya que con la potencia que poseen los ordenadores hoy en día se puede fácilmente revertir el algoritmo para desencriptar los datos.

Entonces ¿Qué función hash debo utilizar?

La versión 5.5 de PHP incluye por defecto una API muy sencilla de utilizar para codificar y verificar contraseñas. No obstante, a partir de la versión 5.3.7 existe una librería con la misma funcionalidad.

La API se basa principalmente en el uso de 2 funciones:

1. password_hash

Se trata de la función más importante de la API. Se encarga de codificar la contraseña introducida con el algoritmo indicado.

Formato

string password_hash ( string $password , integer $algo [, array $options ] )

Parámetros

  • password: La contraseña sin codificar.
  • algo: Algoritmo a utilizar. Actualmente soporta 2:
    • PASSWORD_DEFAULT, con el algoritmo bcrypt.
    • PASSWORD_BCRYPT, que emplea el algoritmo CRYPT_BCRYPT.
  • options: Se puede introducir un array con 2 parámetros opcionales:
    • salt: cadena que se emplea en el proceso de hash para impedir que el resultado se encuentre en listas de pares de hash La función por defecto genera una salt aleatoria para cada contraseña (método recomendado). Se desaconseja usar valores fijos.
    • cost: coste del algoritmo (valores entre 04 y 31). Por defecto se utiliza 10, pero si se dispone de un servidor potente se puede incrementar este valor.

Respuesta

El resultado obtenido es una cadena de 60 caracteres o FALSE en caso de error. Debido a que los algoritmos aceptados pueden variar con el tiempo es recomendable usar campos de mayor longitud, como por ejemplo de 255 caracteres.

2. password_verify

Es la segunda función más destacada de la API. Comprueba si la contraseña original y el hash almacenado coinciden.

Formato

boolean password_verify ( string $password , string $hash )

Parámetros

  • password: Contraseña sin codificar.
  • hash: Cadena generada con la función password_hash()

Respuesta

Si las contraseñas son iguales el resultado obtenido es TRUE, en caso contrario FALSE.

3. Otras funciones

  • password_get_info: función que devuelve información sobre un hash (constante del algoritmo utilizado, nombre del algoritmo y opciones empleados en el hasheo)
  • password_needs_rehash: función que comprueba si un hash ha sido generado con el algoritmo y las opciones especificadas.

Conclusión

Los programadores debemos ser conscientes de la importancia que tiene asegurar la información de los usuarios, puesto que si los hackers consiguen descifrar sus contraseñas no sólo se puede ver comprometido nuestro entorno, sino que además pueden verse afectados muchos de los servicios que utilicen ya que, aunque no es recomendable, está muy generalizado el uso de la misma contraseña para diferentes cuentas o servicios.

En definitiva, una de las bases fundamentales de esta profesión es la formación continua y conocer las últimas novedades de cada entorno o lenguaje que utilicemos, de manera que podamos aplicar las mejores prácticas de seguridad y ofrecer software de calidad.

 

 

Fuentes:

The following two tabs change content below.

Fausto López

Soy una persona alegre, positiva, en formación continua, responsable e implicado en todo lo que hago. En lo personal soy muy familiar, me encanta bailar, ir al cine y viajar.

Latest posts by Fausto López (see all)

Compartir: