Protección de Contraseñas con Argon2 en PHP 7

Publicado el 20 julio 2018 por Juan Ricardo Castro Lurita @pepoflex

Ya hace mucho que se lanzó la versión de PHP 7 y aun estamos viendo las nuevas mejoras y novedades que poco a poco vienen saliendo a la luz, vamos a hablar de la librería mas moderna para proteger contraseñas, Argon2 la cual es más segura que Bcrypt, veamos este y otros detalles en el siguiente artículo.

Algoritmo Argon 2

Este algoritmo fue creado por Alex Biryukov , Daniel Dinu y Dmitry Khovratovich, fue lanzado bajo la licencia Creative Commons y Ganadora del Password Hashing Competition en Julio de 2015. Argon 2 a diferencia de Bcrypt, trabaja en base a 3 factores:

Memoria

Argon 2 utiliza una cantidad en KB a consumir cuando hace el proceso de protección de la contraseña, predeterminadamente usa 1024KB o 1MB y para definirlo en el código PHP escribimos 1<<10 (veremos más abajo un ejemplo)

Tiempo

Argon 2 utiliza una cantidad determinada de tiempo que debe emplear para hacer la protección de una contraseña, por defecto hace la protección en 2 tiempos o 2 pasos.

Factor paralelo

Cuando Argon 2 esta haciendo la protección de una contraseña, paralelamente se ejecutan cierto subprocesos para un mejor rendimiento, por defecto ejecuta 2 subprocesos paralelamente.

Existen 2 versiones de este algoritmo Argon2i y Argon2d.

Argon 2i es seguro contra ataques laterales  y Argon 2d protege contra los craqueos al GPU.

Trabajando con Argon 2 en PHP 7

Si tienes PHP 7 te aconsejamos actualizarte a PHP 7.2 ya que se agrego compatibilidad con Argon2 a partir esta versión y no necesitas instalar extensiones y librerías adicionales, ya viene por defecto en el core de PHP 7.2

La sintaxis del uso de Argon 2 en PHP sería mas o menos la siguiente:

password_hash('password', PASSWORD_ARGON2I);

Mencionadas arriba las 3 constantes o factores que usa Argon las listaremos a continuación

PASSWORD_ARGON2_DEFAULT_MEMORY_COST

PASSWORD_ARGON2_DEFAULT_TIME_COST

PASSWORD_ARGON2_DEFAULT_THREADS

En base a estas 3 constantes si aplicamos la protección de contraseña en PHP con Argon 2 , tendríamos la siguiente estructura

$password = 'mipassword';
$options = ['memory_cost' => 1<<10, 'time_cost' => 4, 'threads' => 2];
$protegerpass = password_hash('$password', PASSWORD_ARGON2I, $options);

En el ejemplo cambiamos el Tiempo a 4, para que veas que puedes personalizar las opciones.

Si ejecutamos var_dump($protegerpass) obtendremos un cadena de 98 caracteres algo similar a:

$argon2i$v=19$m=1024,t=4,p=2$MtxLemFoVnZFaEJuT1NyYg$4j2ZFDn1fVS70ZExmlJ33rXOinafcBXrp6A6grHEPkI

A continuación usaremos una contraseña diferente, si queremos acceder acceder a la información de un hash podemos usar la función password_get_info pasando le primero la funcion var_dump

var_dump ( password_get_info ( '$ argon2i $ v = 19 $ m = 65536, t = 3, p = 1 $ SWhIcG5MT21Pc01PbWdVZw $ WagZELICsz7jlqOR2YzoEVTWb2oOX1tYdnhZYXxptbU' ) ) ;
 
array ( 3 )  { 
  [ "algo" ] => 
  int ( 3 ) 
  [ "algoName" ] => 
  cadena ( 7 )  "argon2i" 
  [ "opciones" ] => 
  matriz ( 3 )  { 
    [ "memory_cost" ] => 
    int ( 65536 ) 
    [ "time_cost" ] => 
    int ( 3 ) 
    [ "hilos" ] =>
    int (1 ) 
  } 
}

Por ultimo mencionar que PHP es por ahora el primer lenguaje de programación que soporta esta moderna tecnología de cifrado de contraseñas, en un futuro otros lenguajes de programación pueden optar por usarla.

imagen: phpcantho.com

Notas

  • En PHP 7.2 ya se puede usar Argon2 sin instalar extensiones adicionales.
  • Argon2 se considera el sucesor de los métodos bcrypt / scrypt / pbkdf para proteger contraseñas, seria bueno vayas probando este moderno método ya que en un futuro puede llegar a ser usado por defecto en PHP.

Síguenos en las Redes Sociales para que no te pierdas nuestros próximos contenidos.