2011-03-17 17 views
21

Estoy instalando un script de registro de usuario (Tank Auth) para mi sitio web.Hashes de contraseñas portátiles (PHPass). ¿Debería usarlos?

En la guía de instalación su dice,

ADVERTENCIA: Por defecto, la biblioteca genera fuertes hashes de contraseñas específicos del sistema que no son portátiles. Significa que una vez creada, la base de datos del usuario no se puede volcar y exportar a otro servidor. Este comportamiento puede cambiarse en config-file también.

Esto me puso en un dilema. En el futuro, es posible que desee cambiar los servidores, pero tampoco quiero contraseñas débiles. ¿Los hashes de contraseñas portátiles son un gran riesgo? Y más importante aún, ¿qué quieren decir con hash? ¿Es la duración del personaje?

+4

Esto no está fuera de tema, se trata de la portabilidad de hashes generados por PHPass en modo no portátil. –

Respuesta

92

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.

  1. $final = '$P$'

  2. $final .= encode64_int($rounds) (desde el constructor, es mínimo 5 en PHP 5+, 3 otra)

  3. $final .= genSalt() sal es de 6 bytes ... 8 bytes en formato ("encode64")

  4. $hash = md5($salt . $password)

  5. Para 2$rounds veces, hacer $hash = md5($hash . $password)

  6. $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 
+13

+1 increíble y CON DIAGRAMAS! – JohnP

+1

Gracias por el aviso, eliminé mi respuesta para que nadie tenga una idea equivocada. – JohnP

+1

Brillante respuesta! ¡Gracias! Aprendí más de lo que esperaba – CyberJunkie