"Declaración oficial" en php.net: CRYPT_BLOWFISH es el algoritmo hash más fuerte. ¿Por qué?

10

Primero: hice esta pregunta en stackoverflow y me pidieron que publicáramos esto nuevamente aquí. Consulte la pregunta original aquí .

De acuerdo con las [primeras] páginas de documentos de la nueva API de cifrado / cifrado de contraseña de PHP 5.5, el algoritmo utilizado CRYPT_BLOWFISH es el "algoritmo más fuerte actualmente compatible con PHP" (haga una búsqueda de texto completo para encontrar la cita en la página). ).

Mi pregunta es: ¿Puede comprobarse con algunos números, puntos de referencia, etc.?

De acuerdo con el crypt() página del documento de PHP CRYPT_BLOWFISH usa sal de 22 caracteres y genera un hash de 60 caracteres, y CRYPT_SHA512 usa sal de 16 caracteres y genera un hash de 118 caracteres. Ambos algoritmos tienen factores de costo modificables, por lo que a primera vista, SHA512 parece más fuerte (porque es más largo).

    
pregunta Sliq 25.05.2013 - 21:14
fuente

2 respuestas

11
  • estamos hablando de más fuerte para el hashing de contraseñas aquí. Un buen hash de propósito general no necesita ser un buen hash de contraseña, y viceversa.
  • La longitud del hash es irrelevante una vez que excede un cierto umbral. Un ataque de pre-imagen en un hash de n bits cuesta 2 n . Para un hash de 128 bits esto es completamente inviable.
  • bcrypt que usa una notación exponencial para el costo y sha512-crypt que usa una notación lineal es irrelevante. Comparar el costo de la CPU con los parámetros predeterminados tampoco tiene sentido.

    En la práctica, elige un presupuesto de tiempo, digamos 10ms. Luego, ajusta el factor de costo del hash para que coincida con ese presupuesto. Entonces, si un atacante usa el mismo hardware que el defensor, todos los hashes de contraseña decentes serían los mismos.

  • Un atacante usa un hardware diferente del defensor. El defensor utiliza una CPU estándar. El atacante usa al menos una GPU, o si es un atacante avanzado, tal vez un FPGA o ASIC.

    La diferencia entre diferentes hashes es la forma en que se ejecutan en diferentes tipos de hardware. BCrypt necesita unos pocos kilobytes de memoria realmente rápida. Esto funciona bien con las CPU comunes, pero no funciona bien con las GPU. Así que bcrypt es muy poco amigable con la GPU. Con FPGA, la ventaja de bcrypt es menor, especialmente si tiene RAM integrada. Pero sigue siendo un poco mejor.

  • Un simple punto de referencia en el que puede ajustar los hashes candidatos al mismo costo. Luego ejecute un cracker de contraseñas basado en GPU, como hashcat o john-the-ripper y verifique su rendimiento. Espero que bcrypt tenga un hashrate mucho más bajo.
  • También hay otro esquema de contraseña interesante llamado scrypt. Utiliza una mayor cantidad de memoria y si su presupuesto de tiempo es grande es significativamente mejor que bcrypt o SHA512-crypt.
respondido por el CodesInChaos 26.05.2013 - 00:20
fuente
1

La "prueba matemática" es que puede elegir N arbitrariamente:

t(bcrypt) * (2^N) >> t(sha)

El hash final tiene que ver con evitar colisiones, para que estés seguro siempre y cuando

hash >> password

La sal tiene que ver con evitar las tablas del arco iris, por lo que estás a salvo mientras

(rainbow table size) * (salt) >> (attacker storage space)
    
respondido por el Enos D'Andrea 20.12.2014 - 11:09
fuente

Lea otras preguntas en las etiquetas