2012-06-08 15 views
6

Por ejemplo, con pez globo se vuelve algo así como:¿Es seguro almacenar un PHP crypt() resultado en el db?

$2a$12$DEzG.CRsHpxpTOAHooQ.wuR6Xe9h6PxFPhOcOvf.lqDNw1TVYVnEO

que contiene información sobre el tipo de hash ALG y contiene la sal. Muchos recursos dicen que solo almacene este valor en el db y será seguro. ¿Pero no podría alguien simplemente probar una lista común de contraseñas en contra de estos valores para descifrar algunos de ellos?

+0

no es segura su base de datos? – CompanyDroneFromSector7G

Respuesta

7

La seguridad del uso de contraseñas no proviene de que la información sea secreta. Ya ha descartado el secreto real, es decir, la contraseña que es la base para el valor hash. El hash restante es simplemente una especie de huella dactilar de estos datos originales. La seguridad proviene del hecho de que no es posible derivar los datos originales del hash. La única posibilidad es probar todas las contraseñas posibles y ver qué produce el mismo hash. La seguridad aquí proviene del hecho de que esto es computacionalmente muy costoso y es poco probable que tenga éxito en una cantidad de tiempo útil.

La sal solo se introdujo para evitar que alguien utilice un conjunto precomputado de contraseñas hash conocidas, lo que obliga a un atacante a reconstruir todas las contraseñas posibles con la sal única. La sal en sí misma no es secreta, tampoco lo es el algoritmo hash.

En resumen: sí, ese valor es absolutamente seguro de almacenar en una base de datos.

4

El hash generado por crypt() está destinado específicamente a ser almacenado. No importa cuál sea el esquema de hash de contraseñas, si alguien obtiene los contenidos de su base de datos, podrá usar sus contraseñas de manera bruta y no tendrá la opción de no almacenar hashes de contraseñas. Los algoritmos aplicados por crypt() se seleccionan específicamente porque requieren un tiempo considerable para calcular el hash; esto no es evidente cuando solo se prueba una contraseña, pero la fuerza bruta de miles de contraseñas se vuelve imprácticamente lenta.

1

¿Pero no podría alguien simplemente probar una lista común de contraseñas contra estos valores para descifrar algunos de ellos?

Siempre se puede hacer sin importar cómo se almacenan las contraseñas. La función crypt no evita esto, pero lo hará realmente muy lento. Si un usuario usa una contraseña realmente común (como 123456), ningún algoritmo de hash en el mundo lo protegerá.

Si no permite esas contraseñas simples y utiliza un buen algoritmo hash (ese suministro crypt()) ha hecho todo lo posible para proteger las contraseñas.

0

Si alguien tiene acceso a su base de datos, entonces tendrían acceso a la sal de cualquier manera, ya que debería usar una sal diferente para cada contraseña de usuario (que probablemente almacenaría en la base de datos).

El objetivo de la sal es que las tablas de arco iris no funcionen. El individuo tendría que volver a manipular cada combinación de contraseña + sal para determinar la contraseña. Utiliza una sal diferente en cada contraseña, por lo que tiene que volver a generar millones de hashes para cada uno.

Otra buena información sobre la cripta se puede encontrar aquí: Why does PHP crypt() prepend the salt to the hash?

Cuestiones relacionadas