Nueva configuración de autentificación
Ahora que se ha dicho adiós definitivamente a PHP 5.4 se puede comenzar a mejorar aún más las herramientas utilizadas para crear y verificar los hash de contraseña. Desde XF 2.0 se han intentado utilizar las siguientes funciones que se han agregado en PHP 5.5 si es que estaban disponibles:
Ahora que cada cual ejecuta PHP 5.6 como mínimo, ya se pueden utilizar funciones nativas de PHP que cubran todas las necesidades de hash de contraseña.
Desde
XF 1.2 se ha utilizado Bcrypt para los hash de contraseña, ya antes de que estuviera soportado nativamente por PHP e incluso hoy permanece como el principal algorítmo de hash por encima de PHP 7.2 y 7.3.
A la vez, PHP agregará métodos de hash adicionales y sería ideal si se pudieran soportar sin tener que realizar cambios en el código. Las funciones antes mencionadas como una interfaz consistente es una parte del camino adoptado, además de flexible, pero hasta ahora no había realmente una forma más sencilla de utilizar un algoritmo diferente, si lo había disponible, o de admitir una configuración más granular .
Sin embargo, PHP actualmente
tiene implementado (técnicamente) dos nuevos algorítmos de hash de cotraseña basados en
Argon2. Esto se introdujo primero en PHP 7.2 utilizando una variante conocida como Argon2i que se mejora aún más en PHP 7.3 utilizando la variante conocida como Argon2id.
Por defecto, XF intentará utilizar siempre el algorítmo de hash más ampliamente soportado disponible de forma predeterminada, por lo que aún permanece Bcrypt. Pero cuando se tiene una versión apropiada de PHP y los necesarios pre-requisitos instalados (PHP debe compilarse explícitamente con soporte Argon2) estará permitido utilizarlo, por lo que en XF 2.1 ahora se puede. Y es tan simple como agregar varias líneas en el archivo src/config.php.
Lo siguiente activará el soporte Argon2i si se está utilizando PHP 7.2:
PHP:
$config['auth'] = [
'algo' => PASSWORD_ARGON2I
];
Lo siguiente activa el soporte Argon2id cuando se utiliza PHP 7.3:
PHP:
$config['auth'] = [
'algo' => PASSWORD_ARGON2ID
];
Y, aunque no es necesario porque los valores predeterminados de PHP debieran ser suficientes (y posiblemente aumentarán con el tiempo), incluso se puede hacer que los hash de las contraseñas sean aún más seguros al pasar parámetros adicionales para controlar varios factores de costo:
PHP:
$config['auth'] = [
'algo' => PASSWORD_ARGON2ID,
'options' => [
'memory_cost' => 1<<17,
'time_cost' => 4,
'threads' => 2
]
];
Gracias a la flexibilidad de la API para hash de la contraseña en PHP, cualquier cambio en el algoritmo u opciones causará automáticamente el re-hash de cualquier contraseña cuando inicie sesión el usuario.
Aunque se ha recomendado altamente utilizar la última versión de PHP que se soporta y también se recomienda la utilización del hash Argon2i/id si está disponible, hay que vigilar estrechamente en el caso de tener que bajar la versión de PHP o de cambiar de servidor. Si Argon2 repentinamente deja de estar disponible por cualquier motivo, es probable que se encuentren errores y no se pueda verificar ninguna contraseña sin hacer primero un restablecimiento de la misma.