¿Qué método de cifrado de PHP es más seguro de forma incidental?

0

recién comencé a investigar sobre los últimos métodos de encriptación de PHP, descubrí que mis algoritmos favoritos están comprometidos. MD5 no es bueno, SHA-1 tiene "fallas encontradas", SHA-512 no es "para contraseñas", todas son de varios sitios de StackOverflow.

HMAC a partir de 2011 no tenía "ataques conocidos", y el password_hash de PHP es una nueva adición que utiliza un "algoritmo de una vía fuerte".

He escuchado cosas buenas sobre HMAC + MD5, aunque se ha sugerido que sería mejor utilizar un algoritmo que aún no se haya comprometido. Veo que bcrypt es un complemento, está el crypt nativo () y ahora mcrypt? ¿Pero password_hash maneja todos estos?

Para mí, todo comienza a sonar como un juego mortal de lo que suena mejor. ¿Puede una persona con conocimientos adecuados sobre el tema responder: qué método (s) de cifrado de PHP compatible con la autenticación de contraseña es actualmente más seguro y no tiene vulnerabilidades conocidas? En otras palabras, ¿qué método produce el hash que es menos probable que se genere maliciosamente? ¿Alguna funcionalidad nativa de PHP hace la lista?

    
pregunta John 23.12.2014 - 02:38
fuente

4 respuestas

2

Como se mencionó anteriormente, su elección de primitiva criptográfica dependerá de lo que quiera hacer con ella.

Para el almacenamiento de contraseñas, querrá usar un algoritmo de hash. Un hash es una operación unidireccional que le dará una salida determinista única para una entrada dada, pero es imposible revertir la operación. Por ejemplo, si uso el algoritmo sha-1 en la cadena 'contraseña', obtendré la salida '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8' cada vez. No es posible tomar la cadena '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', invertir la operación de hashing y obtener la cadena 'password'. De esta manera, puede autenticar al usuario mediante el hash de la contraseña que proporcionó al iniciar sesión con el hash que está almacenado en la base de datos, y si su base de datos es robada (a través de una inyección SQL o por algún otro medio) el atacante no puede obtener la información del usuario. contraseña.

¿Qué pasa con el crackeo de contraseñas? Si un atacante puede obtener acceso a los hashes de contraseña de sus usuarios, intentarán descifrarlos. Harán una conjetura acerca de cuál es la contraseña de cleartext, la ejecutarán a través del algoritmo de hash y la compararán con el valor de hash que fue robado de la base de datos. Una plataforma de descifrado de contraseñas hecha a la medida puede hacer esto muy rápidamente, por lo que debe tomar medidas para defenderse de ella.

Ingrese la Función de derivación de claves (KDF). Un KDF es similar a su hash estándar, con una diferencia: es muy lento. Básicamente, hará un hash sobre la entrada en un número específico de iteraciones, y solo después de completar ese número especificado de iteraciones saldrá con el valor correcto. El resultado final es que un atacante debe dedicar mucho más tiempo a recuperar la contraseña del usuario, lo que le dará más tiempo para responder a la violación / restablecer las contraseñas de su usuario, etc.

Entonces, para tomar una ruta larga y tortuosa hacia su respuesta, desea utilizar un KDF, como PBKDF2

    
respondido por el user52472 23.12.2014 - 18:22
fuente
2

El nuevo password_hash introducido en PHP 5.5.0 crea un algoritmo de hashing de una manera muy fuerte. Toda la información que se necesita para verificar el hash se incluye en ella.

Intenté ejecutar un bucle 5000 veces, y cada hash para una única contraseña era un hash único. Para crear un hash de contraseña, simplemente puede utilizar:

$password = '170991';
$hash = password_hash($password, PASSWORD_DEFAULT);

Para verificar la contraseña, simplemente podemos usar:

password_verify($password, $hash);
    
respondido por el rajankur 04.04.2015 - 19:09
fuente
0

Lo bueno de las funciones password_hash() y password_verify() de PHP es que están diseñadas pensando en el futuro, pero también están diseñadas para ser compatibles con versiones anteriores.

El algoritmo de hash que password_hash() usa para crear un hash se almacena en la salida producida por password_hash() , y así es como password_verify() sabe qué algoritmo usar para verificar una contraseña dada contra un hash dado.

A medida que se inventen algoritmos hash más nuevos / más fuertes en el futuro, estos se incorporarán en las funciones password_hash() y password_verify() en las futuras versiones de PHP. Pero, como el algoritmo de hash se almacena en la salida de password_hash() , este par de funciones siempre será compatible con versiones anteriores. En otras palabras, un hash creado hoy con password_hash() será posible verificar dentro de unos años usando password_verify() en una versión futura de PHP, incluso si el algoritmo utilizado para crear el hash hoy está obsoleto para ese momento.

Por lo tanto, si usa password_hash() y password_verify() , siempre tendrá el beneficio de los últimos algoritmos de hashing disponibles en el momento actual, y siempre podrá verificar los hashes creados con estos algoritmos en el futuro. incluso si esos algoritmos son obsoletos en ese momento.

    
respondido por el mti2935 05.04.2015 - 03:32
fuente
0
  

estos son todos de varios sitios de StackOverflow

¿Debe ser verdad entonces? Tomando el caso de md5, sí, es susceptible de ataques de colisión que se pueden aplicar a firmas y por lo tanto a certificados (y sha1 es muy similar a md5 pero con un hash más grande y más rondas). Sin embargo, aplicar esto a las contraseñas es una propuesta muy diferente. Para aplicar el método de ataque a las contraseñas que necesitarías:

  • una copia de la contraseña con hash
  • de un servicio que acepta contraseñas muy largas

Hay otras formas de atacar un sistema de este tipo, especialmente las tablas de arco iris, pero el uso de una sal adecuada proporciona mucha protección.

Si sha512 no es adecuado para el hash de datos de forma segura, todos estamos en un gran problema.

Algunas otras respuestas aquí mencionan password_hash () pero esta es una API no un algoritmo . Password_hash es una versión actualizada de crypt () sin la compatibilidad con versiones anteriores para métodos de hashing más débiles. Al momento de escribir, password_hash () solo admite bcrypt. Bcrypt es probablemente más fuerte que md5 y sha1; no se sabe que ninguna tenga debilidades algorítmicas, pero eso no significa que ninguna tenga debilidad algorítmica.

En cuanto a cuál es el método más seguro disponible en la actualidad, mi suposición sería pbkdf2 con una sal aleatoria y muchas iteraciones de hidromasaje o sha512. Si eso es apropiado para su aplicación es una pregunta mucho más compleja.

    
respondido por el symcbean 11.06.2017 - 00:28
fuente

Lea otras preguntas en las etiquetas