Task Auth uses PHPass for password hashing (una versión anterior, eso no es una buena señal; es posible que desee update that en su instalación). PHPass tiene dos modos, portable y bcrypt.
Dependiendo de la versión de PHP, no necesita tener hashes portátiles. En PHP 5.3 y superior, PHP proporciona su propia implementación de bcrypt si no está disponible en el sistema. Si todos sus servidores tienen PHP 5.3 y superior, le recomiendo apagar los hashes portátiles. PHPass "hashes portátiles" existe porque, dependiendo de la versión de PHP instalada, bcrypt podría no estar disponible.
Dicho esto, PHPass hashes portátiles almacena la sal en su hash. Es por eso que cada ejecución con la misma contraseña es diferente.
También, PHPass utiliza PHP_VERSION
durante la generación de los hashes * Para comprobar si la función md5()
disponible con que versión soporta el parámetro $rawMode
. Si no lo hace, pack()
se usa para transformar los datos hexadecimales en binarios (tenga en cuenta que esto es considerablemente más lento que simplemente usando $rawMode
, por lo que se realiza la bifurcación).
Nuevamente, si todos sus servidores ejecutan PHP 5.3 y superior, le recomiendo que apague el modo portátil y deje que PHPass use bcrypt
en su lugar. Como PHP 5.3+ proporciona su propia implementación cuando el sistema uno no está disponible, su hash será verificable en todos los sistemas operativos. Incluso si apaga el modo portátil, PHPass seguirá siendo lo suficientemente inteligente como para verificar sus viejos valores hash de la manera correcta.
* Línea 131
EDIT: Para más explicación, aquí es cómo se generan los hashes en modo portátil (simplificado, no utiliza las variables reales que se encuentran en PHPass, pero precisa). Tenga en cuenta que PHPass usa su propia versión de codificación base64.
$final = '$P$'
$final .= encode64_int($rounds)
(desde el constructor, es mínimo 5 en PHP 5+, 3 otra)
$final .= genSalt()
sal es de 6 bytes ... 8 bytes en formato ("encode64")
$hash = md5($salt . $password)
Para 2
$rounds
veces, hacer $hash = md5($hash . $password)
$final = encode64($hash)
Así que el último hash en esencia es la siguiente:
$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
\ \
\ \ Actual Hash
\
\ $P$ 9 IQRaTwmf
\_/ \ \______/
\ \ \
\ \ \ Salt
\ \
\ \ # Rounds (not decimal representation, 9 is actually 11)
\
\ Hash Header
Esto no está fuera de tema, se trata de la portabilidad de hashes generados por PHPass en modo no portátil. –