password_hash password encriptar encriptada desencriptar contraseña con php mysql hash passwords

password - login con contraseña encriptada php



¿Qué función usar para contraseñas hash en MySQL? (5)

MD5 se considera débil según los estándares actuales. 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.

De hecho, 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 posteriores, si no recuerdo mal.

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

¡No olvides hacer salazón también!

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.

¿Cuál sería la mejor forma 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!


No es necesariamente que no se deba usar MD5, tanto que no se debe usar solo MD5, ya que esto lo hace vulnerable a ataques de tabla arcoiris (una tabla de arcoiris es una tabla de valores hash precalculados, si su contraseña es pareja). remotamente común o simple, el atacante solo necesita buscar el hash y conoce tu contraseña de texto plano).

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

Mejor aún es usar una sal diferente para cada contraseña en su base de datos, digamos el nombre de usuario al que está asociada, de modo que un atacante ni siquiera puede generar una tabla de arcoíris para toda la base de datos y tiene que descifrar 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


MD5 y SHA-1 probablemente ya no se recomiendan debido a los ataques conocidos . Pero, en general, todavía son suficientes para la mayoría de los casos de uso.

Si está buscando más opciones, simplemente use las funciones hash de PHP. Allí tiene muchas opciones .


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


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 usa el algoritmo bcrypt mucho más seguro. Si bien MySQL puede encriptar / descifrar bcrypt, es una solución terrible porque no solo está agregando una carga de computación potencialmente grande a su capa de base de datos, sino que la contraseña no grabada podría almacenarse en sus registros.

Bajo ninguna circunstancia debe una contraseña de texto sin formato golpear MySQL, incluso 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 Entonces, no, ni siquiera te molestes ...