¿Algoritmo (s) de hash de contraseña más seguro?

41

¿Cuál es / es actualmente el (los) algoritmo (s) de hash criptográficamente más seguro? ( disponible en PHP )

Velocidad es irrelevante, porque estoy iterando el hash durante un tiempo fijo (en lugar de un número fijo de iteraciones). Lo que me interesa es la fuerza matemática.

Mi intuición me dice que es whirlpool , siendo el más grande y el más lento de todos. Eso o SHA-512. Pero ¿en qué parte de la red puedo ver lo que recomiendan los expertos?

    
pregunta Core Xii 25.06.2011 - 19:26
fuente

6 respuestas

33

Los cripógrafos pueden señalar que, cuando lees la letra pequeña, no hay ninguna prueba de que las funciones hash seguras realmente existan. Lo único que tenemos ahora son candidatos para los que aún no se ha encontrado ninguna debilidad.

Así que lo mejor que puede esperar es una función que ha sobrevivido al escrutinio de muchos criptógrafos durante mucho tiempo. Además, necesita tener una salida lo suficientemente amplia (256 bits son suficientes si desea lograr la "seguridad de 128 bits" y superar eso tiene poco sentido). En este momento, a partir del verano de 2011, esto apunta a SHA-256 o SHA-512, no a Whirlpool.

Basar el recuento de iteraciones en el tiempo que tarda en una máquina típica es una buena idea, pero basar en el tiempo que realmente toma su máquina es < fuerte> no una buena idea. De lo contrario, podría terminar con un número bajo de iteraciones para algunas contraseñas porque la máquina estaba manejando muchas solicitudes en ese instante (una situación que un atacante podría forzar, por cierto). El uso de muchas iteraciones sirve para frustrar a los atacantes haciendo que el hash de contraseñas sea lento en la computadora del atacante , lo que también hace que su sistema sea lento es un subproducto desafortunado; pero el verdadero objetivo es cualquier poder de la máquina que el atacante pueda reunir. Ya que realmente no puede hacer puntos de referencia en la máquina del atacante, tiene que recurrir a estimaciones aproximadas, por lo tanto, un conteo fijo, lo más alto posible siempre que la carga promedio sea tolerable en su sistema (la palabra importante aquí es "promedio", que descalifica una medida dinámica según su intención de realizar).

Además, la máquina del atacante no necesita verse como la tuya; puede ser, por ejemplo, una GPU o una FPGA , que ofrece distintas capacidades de computación de lo que puede obtener en un servidor típico. Desea una función para la cual un atacante no pueda obtener grandes mejoras de rendimiento mediante el uso de hardware que no sea PC. De nuevo, esto promueve SHA-256 o SHA-512, que están diseñados para la eficiencia de la CPU (con operaciones aritméticas de 32 o 64 bits), no Whirlpool, que puede beneficiarse de optimizaciones de hardware similares a aquellas para las que se diseñó AES.

Finalmente, las iteraciones son solo parte del trabajo; También necesitas una sal suficientemente larga y única. Las iteraciones y la salazón pueden ser un poco difíciles de hacer al mismo tiempo; le recomendamos encarecidamente que utilice una construcción estándar como PBKDF2 (aunque fue pensado como una función de derivación de claves, no una contraseña) hasher, PBKDF2 resulta ser razonablemente bueno en eso también.

    
respondido por el Thomas Pornin 07.07.2011 - 18:56
fuente
20

Del comentario de OP:

  

"Seguro" como en, basado en un problema matemático que no tiene una solución rápida conocida. "Más seguro" como en, basado en el más complejo de tales problemas. Un algoritmo de hash se considera "fuerte" cuando romperlo requeriría una contribución importante a la criptología / matemáticas.

Parece como si estuvieras leyendo Thomas Ptacek" Enough With The Rainbow Tables: Lo que necesita saber sobre esquemas de contraseña segura ", y ahora se pregunta qué hash criptográfico moderno optimizado para el almacenamiento de contraseñas es considerado 'el más seguro'.

No creo que haya una respuesta clara. Hasta donde sé, algunos de los favoritos actuales en la comunidad de programación (scrypt & bcrypt) no se han revisado rigurosamente como funciones de hashing de contraseñas. Al menos, no han sido revisados por un gran número de criptógrafos comparables con la forma en que se se revisan las entradas de la competencia de funciones hash del NIST .

Dicho esto, el consenso actual de Hacker News es que el orden es:

  1. scrypt . Debido a que requiere tanto memoria como memoria intensiva, scrypt se cree que tiene el mayor margen de seguridad de los hashes de contraseña actuales . Puede ver más sobre su diseño aquí .
  2. bcrypt fue el campeón anterior, como se menciona en publicación de blog de Thomas Ptacek arriba .
  3. PBKDF2 y varias rondas de SHA2 (fx Unix Crypt con SHA256 ) se cree que es el tercero mejor (cuál de estos es 'mejor' depende en gran medida del número de iteraciones utilizadas).

(Tenga en cuenta que "Hacker News" es principalmente una comunidad de programación, y no como el nombre puede implicar a alguna comunidad de especialistas en seguridad (aunque algunos de ellos también están ahí).)

Si miras a tu alrededor en este sitio, debajo de cryptography contraseñas y las etiquetas hashing fx, luego Verá que normalmente no se menciona un solo "mejor" hash de contraseña. Supongo que eso se debe en parte a que los verdaderos criptógrafos no tienen un consenso claro sobre cuál es el más "fuerte", debido a la relativamente limitada revisión por pares.

Aquí hay una comparación imparcial y fácil de leer (que no lo hace) t incluye scrypt, probablemente porque todavía es demasiado nuevo).

  

La velocidad es irrelevante, porque estoy iterando el hash durante un tiempo fijo (en lugar de un número fijo de iteraciones).

Con algunos de estos hashes, realmente no puedes hacer eso. Proporcionas un "factor de trabajo" cuando llamas a la biblioteca, y la biblioteca se encarga del resto.

    
respondido por el Jesper Mortensen 26.06.2011 - 01:03
fuente
7

CRYPT_BLOWFISH (OpenBSD bcrypt, basado en el cifrado simétrico del pez globo, pero es un algoritmo de hashing real, parece haber mucha confusión sobre esto) y CRYPT_SHA512 son los mejores. Ambos ofrecen la opción de escalar el número de "rondas" utilizadas, lo que le permite elegir una compensación de seguridad / rendimiento.

Por ejemplo, el número predeterminado de rondas para pez globo es 7 (el rango de valores es 4-31). Este valor es logarítmico, por lo que cada aumento hace que el algoritmo se ejecute 10 veces más. Un valor de 13, toma casi 1 minuto por hash en un Core2Duo 2.4ghz

Ajustar esto tan alto como tolerable en cuanto al rendimiento, dará como resultado la seguridad más sólida.

nota: recientemente se encontró un error en algunas implementaciones de bcrypt, y como tal, es posible que desee utilizar SHA-512 en su lugar.

Nota: SHA-512 es más rápido de calcular que SHA-256 en procesadores de 64 bits (especialmente si está optimizado con SSE2_64. Específicamente, debe considerar esto y usar rondas adicionales para asegurarse de que sus hashes sean lo suficientemente fuertes para su propósito.

La aplicación de código abierto hashkill , publicó algunos puntos de referencia de rendimiento sobre la rapidez con la que las GPU modernas podrían romper los algoritmos de hash modernos. Específicamente, una Radeon HD 6990 puede hacer: 11001 Megahashes / seg de MD5 directo (CRYPT_MD5 está en salado y la implementación de FreeBSD usa 100 rondas). Recta SHA1 a 3444 Megahashes / s.

    
respondido por el Allan Jude 25.06.2011 - 23:56
fuente
0

Le recomiendo que utilice phpass

  

Este es un dominio público portátil   marco de hashing de contraseña para su uso en   Aplicaciones PHP Esta destinado a trabajar   con PHP 3 y superior, y tiene   En realidad ha sido probado con al menos PHP   3.0.18 a 5.3.0 hasta ahora.

     

El hashing preferido (más seguro)   método soportado por phpass es el   Bcrypt basado en Blowfish estilo OpenBSD,   También soportado con nuestro dominio público.   paquete crypt_blowfish (para C   aplicaciones), y conocido en PHP como   CRYPT_BLOWFISH, con un retroceso a   Hashes extendidos basados en DES de estilo BSDI,   conocido en PHP como CRYPT_EXT_DES, y un   último recurso de recurso a MD5-based   Recuento de iteraciones saladas y variables.   hashes de contraseña implementados en phpass   sí (también conocido como portátil   hashes).

Como dice el sitio web, el cifrado basado en Blowfish es el hashing más seguro. Creo que esto es cierto porque es " prueba de ley de Moore " mientras que la mayoría de los demás no lo son.

    
respondido por el Alfred 25.06.2011 - 19:59
fuente
-2

Si la velocidad no es un problema, solo agregue las salidas de múltiples funciones hash. (Whirlpool, sha-512, etc). El mismo principio que el cifrado múltiple, cualquier debilidad diseñada o encontrada no funcionará a través de múltiples funciones hash. Básicamente, tome la cadena x, ejecútela a través de n hashes por separado (no encadenados, ejecute cada uno por separado en la misma entrada), agregue los resultados en un nuevo bloque. Repita haciendo lo mismo al nuevo bloque. Supongo que está haciendo esto para el almacenamiento seguro de contraseñas. Asegúrate de usar una verdadera sal aleatoria también, y una independiente para cada hash. (Y por favor use uno de longitud completa).

    
respondido por el Realanswer 12.06.2014 - 15:03
fuente

Lea otras preguntas en las etiquetas