2008-12-03 44 views
11

Tengo una tabla de usuario en mi base de datos mysql que tiene una columna de contraseña. Actualmente, utilizo el algoritmo MD5 para cifrar la contraseña de los usuarios para el almacenamiento en la base de datos. Ahora me gusta pensar que soy una persona de conciencia de seguridad. Al leer los documentos de MySQL noté que no recomiendan los métodos de hash MD5 o SHA/SHA1, pero no ofrecen una alternativa.¿Qué función usar para contraseñas hash en MySQL?

¿Cuál sería la mejor manera de hash mis contraseñas en MySQL? Una función que es nativamente compatible con PHP y MySQL sería ideal y necesaria con mi implementación actual.

Gracias!

Respuesta

12

No es necesariamente que no se debe utilizar MD5, tanto que es que no se debe utilizar simplemente MD5, ya que esto deja vulnerable a los ataques de arco iris de mesa (una tabla de arco iris es una tabla de valores hash precalculados - si su contraseña es remotamente común o simple, el atacante solo necesita buscar el hash y conoce su contraseña de texto plano)

Por lo menos, debe agregar un salt a cada contraseña para que cualquier tabla rainbow existente es inútil, obligando al atacante a generar una nueva tabla de arcoíris completa solo para su base de datos de contraseñas.

Mejor aún es el uso de una sal diferente para cada contraseña en su base de datos, por ejemplo el nombre de usuario que está asociado con, por lo que un atacante no puede incluso generar una tabla de arco iris para toda su base de datos y tiene que romper cada entrada por separado.

MD5 es también un algoritmo muy rápido. La velocidad es el enemigo cuando se trata de agrietarse: cuanto más tiempo se tarda en generar un hash, más tiempo tarda en cada intento que hace un hacker. Algo simple como mezclar el texto plano 100 veces con una nueva sal adicional sería apenas perceptible (si es que lo es) para un usuario que inicia sesión en su sitio, pero aumentaría el tiempo necesario para aplicar una contraseña bruta por el mismo 100 veces.

mucho, mucho más detalle aquí: http://www.codinghorror.com/blog/archives/000953.html

1

MD5 y SHA-1 probablemente no se recomiendan ya debido a know attacks. Pero todavía son generalmente suficiente para la mayoría de los casos de uso.

Si está buscando más opciones, solo use PHP hash functions - tiene plenty of options allí.

4

MD5 se considera que es débil para los estándares de hoy en día. Todavía tomaría un poco de trabajo descifrar un hash hecho con MD5, pero es mucho más fácil que adivinar la contraseña por fuerza bruta. Idealmente, crackear un hash no debería ser más fácil que la fuerza bruta.

SHA1 también se considera más fácil de descifrar que adivinar la contraseña por fuerza bruta.

En realidad contribuí con un parche para MySQL para hacer frente a las funciones SHA224, SHA256, SHA384 y SHA512 de OpenSSL. Estos son recomendados por NIST para la codificación de contraseñas (en realidad SHA256 y superior).

Mi parche fue terminado por los ingenieros de MySQL, y está incluido en MySQL 6.0.5 y posterior, si no recuerdo mal.

Si utiliza una versión anterior de MySQL (y no), entonces probablemente pueda utilizar una implementación de funciones hash fuertes en su lenguaje de host. PHP tiene la función hash() por ejemplo. Puede hacer el hash en su aplicación y guardar la cadena de mensaje resultante en la base de datos.

¡No olvide hacer salting, también!

-3

Estoy usando una combinación . Por ejemplo SHA1 (MD5()) funciona bien.

+1

Esto realmente no es tan seguro. Si bien la combinación de hashes es más segura, el costo de romper SHA1 está llegando rápidamente al punto en que es trivial de romper. MD5 ya está allí. – Machavity

+0

SHA1 (MD5 (CONTRASEÑA (SHA1 (MD5 ('lalala'))))) es seguro, creo. –

+0

Lea: https://gist.github.com/MadaraUchiha/041a886e1bf27da5373c (Alerta de spoiler, 'SHA1 (MD5 (' es menos seguro que 'SHA1 (') –

2

Esta pregunta tiene 7 años. En ese tiempo, hemos progresado en computación, donde MD5 y SHA1 ahora se rompen fácilmente con las computadoras modernas. Estos deben evitarse ahora.

Con PHP 5.5 vino la introducción de password_hash, que utiliza el algoritmo bcrypt mucho más seguro. Mientras que MySQL puede cifrar/bcrypt descifrar, es una solución terrible porque no sólo se va a añadir una carga de cálculo potencialmente grande a su capa de base de datos, pero the unhashed password could be stored in your logs

Bajo ninguna circunstancia debe una contraseña en texto plano golpeado MySQL, incluso si en el nivel de consulta. De lo contrario, corre el riesgo de escribir las contraseñas para el registro (registro de consultas, registro general, registro lento de consultas, etc.). Que es horrible Así que no, ni siquiera moleste ...

Cuestiones relacionadas