¿Se puede usar password_verify () para identificar la contraseña después de una violación de la base de datos?

5

Soy un novato en PHP y hash de contraseñas. Sigo las instrucciones proporcionadas @ Hash de contraseña segura para copiar mi contraseña de usuario antes de guardarla.

Mis preguntas son:

  1. PHP recomienda el método password_hash() como una forma segura preferida de hash. En caso de una violación de la base de datos, ¿el pirata informático no usará password_verify() e identificará las contraseñas en lugar de usar una tabla de búsqueda de arco iris?

  2. Si es así, ¿cuál debería ser mi enfoque para cerrar esta brecha de seguridad?

pregunta Mr.X 18.11.2014 - 14:15
fuente

4 respuestas

5

password_verify() toma dos argumentos: una cadena de la que desea verificar si es la contraseña correcta y el valor que calculó anteriormente con password_hash() , que presumiblemente almacenó en algún lugar de la base de datos.

Una aplicación típica podría ser:

<?php
$hash = password_hash('my-secret', PASSWORD_DEFAULT);
// normally you would save the hash somewhere, but we'll just continue in this example

$check_a = 'other-secret';
$check_b = 'my-secret';
if (password_verify($check_a, $hash))
   echo 'Check A was the original password: ' . $check_a;
if (password_verify($check_b, $hash))
   echo 'Check B was the original password: ' . $check_b;

La salida será:

Check B was the original password: my-secret

Si desea obtener la contraseña original a partir de un hash calculado por password_hash() , deberá probar todas las posibilidades; eso es lo que muestra este ejemplo. Debido a la arquitectura de password_hash() , encontrar una contraseña como ésta llevará mucho tiempo, por lo que no vale la pena.

También tenga en cuenta, en password_hash() doc :

  

PASSWORD_DEFAULT : use el algoritmo bcrypt (predeterminado a partir de PHP 5.5.0). Tenga en cuenta que esta constante está diseñada para cambiar con el tiempo a medida que se agregan algoritmos nuevos y más sólidos a PHP. Por esa razón, la longitud del resultado de usar este identificador puede cambiar con el tiempo. Por lo tanto, se recomienda almacenar el resultado en una columna de la base de datos que pueda expandirse más allá de 60 caracteres (255 caracteres sería una buena opción).

El algoritmo está diseñado para cambiar con el tiempo, de modo que se mantenga seguro, y encontrar una contraseña por fuerza bruta no será posible con computadoras más rápidas (suponiendo que la instalación de PHP en su servidor esté actualizada)

En cualquier caso, un hash es unidireccional: no puedes darle la vuelta. Solo puedes verificar una contraseña determinada calculando el hash de que uno y comprobando si es el mismo.

    
respondido por el Keelan 18.11.2014 - 14:32
fuente
0

password_verify() solo confirmará si una contraseña dada coincide con el hash dado. Todavía requiere una entrada, y las tablas de arco iris son una forma de generar posibles contraseñas para la entrada. Sin embargo, si está generando un valor de sal de tamaño recomendado, ayudará a protegerse contra los ataques de la tabla arco iris.

Puede encontrar más información sobre cómo proteger correctamente las contraseñas usando hashes y sales leyendo Cómo hackear de forma segura las contraseñas .

    
respondido por el RoraΖ 18.11.2014 - 14:28
fuente
0

Dado que las funciones de hash son realmente difíciles de invertir, no se puede simplemente deducir una solución proporcionando el hash. Existe una probabilidad insignificante de que un atacante pueda desarrollar una estrategia para encontrar una contraseña que coincida con el resumen que almacena en la base de datos. No sé cuál es el método hash predeterminado de PHP, pero todos los algoritmos modernos de hash son resistentes a las colisiones, así que no se preocupe.

    
respondido por el Ugur 18.11.2014 - 23:10
fuente
0

La única forma de obtener la contraseña real es usar un ataque de fuerza bruta en la contraseña con hash, ya que el algoritmo de hash de contraseña php predeterminado es bcrypt, llevaría mucho tiempo.

    
respondido por el xen 11.11.2015 - 22:37
fuente

Lea otras preguntas en las etiquetas