¿Vale la pena utilizar MD5?

  • Autor Autor Jackass89
  • Fecha de inicio Fecha de inicio
A ver, nada es imposible de sacar a fuerza bruta, lo que si es imposible es desencriptarlo. Como sabéis MD5 son 32 caracteres formados por letras y/o números. Entonces siempre hay la posibilidad de que se repita uno de los valores, si cuentas que hay 26 letras (que siempre son minúsculas) y 10 números (del 0 al 9) y elevamos 36^32 sabemos que al encriptar 36,3x10^49 contraseñas distintas al menos se repetirá una vez el hash. Con eso quiero decir que sea una contraseña más larga o más corta, siempre habrá la posibilidad de entrar a la cuenta con una contraseña diferente, así que siempre está la posibilidad de la fuerza bruta, y puede que por casualidad coindica con el hash de 'a', y te la saque en un segundo (aun que hay una posibilidad entre 36,3x10^49). Con eso quiero decir que la contraseña nunca es segura uses esta encriptación, uses sha1 o uses la que uses. Así que si lo haces por eso, no, no vale la pena (bajo mi punto de vista), ya que con conseguir una contraseña con cada hash, sobra para entrar en dicha cuenta, y así es como se hacen esas grandiosas bases de datos de hashes, al tener un hash que se repita, se intenta generar otro, y otro... (eso o encriptar también todas las contraseñas posibles con todos los caracteres posibles por orden, que es fácil hacerlo). Por ello, como iba diciendo, no vale la pena.
Lo que si vale la pena es encriptarlas por que si usas esa misma contraseña en otro sitio y usan una encriptación diferente, al menos puede que no sea la misma (y eso si consiguen desencriptarla y no lo hacen a fuerza bruta). Con eso también se pretende evitar que los administradores vean las contraseñas (y si no recuerdo mal, hay una ley que lo exige). Sea como fuere, lo mejor es usar una contraseña diferente en cada sitio, y que sea larga y rara.
Yo usaría sha1, hay menos bases de datos que las desencripten (es un poco menos común). Pero ahora recomiendan usar whirlpool, y la verdad es que lo veo sólido. De todos modos si que recomiendo añadir siempre una 'salt' que es algo que se añade antes, después, en medio (o donde quieras, pero siempre en el mismo sitio) del a contraseña. PHP: hash - Manual <- Ahí más información.

P.D: Si quieres evitar esa posible coincidencia en el md5 (como he explicado antes), lo que se hace es almacenar 2 hashes diferentes en la base de datos, uno con la salt al principio y otro con la salt al final, así si coincidiera la contraseña con una salt, al menos de la otra no coincidiría, y siempre quitas más posibilidades, o incluso almacenar dos hashes, uno de sha1 y otro de md5, o cosas así. Cuantos más, mejor, pero a la vez peor por ser más posible de 'desencriptar' (y lo pongo entre comillas por que no la desencriptas, la buscas en una base de datos y si encuentras una contraseña igual generada por su robotito, te la devuelve).

Suerte 🙂
 
Hay frameworks (symfony) que usan md5 en bucle hasta 500 veces para encriptar una contraseña. Te aseguro que ningún diccionario va a tener las claves generadas...
 
Hay frameworks (symfony) que usan md5 en bucle hasta 500 veces para encriptar una contraseña. Te aseguro que ningún diccionario va a tener las claves generadas...
Como ya dije las contraseñas se pueden repetir, y a lo mejor: 'sdfdhferwioh4eio' encriptado 500 veces coincide con el hash de 'a' una sola vez (es un ejemplo, no se con cual coincide 'a'), pero te digo que es inútil, la única forma es usar dos encriptaciones diferentes y guardarlas y comprobar si ambas coinciden, eso es lo más seguro que hay.
 
Como ya dije las contraseñas se pueden repetir, y a lo mejor: 'sdfdhferwioh4eio' encriptado 500 veces coincide con el hash de 'a' una sola vez (es un ejemplo, no se con cual coincide 'a'), pero te digo que es inútil, la única forma es usar dos encriptaciones diferentes y guardarlas y comprobar si ambas coinciden, eso es lo más seguro que hay.

Por mucho que el hash generado 500 veces coincida con a, es imposible saber el paswd orignal.

Me explico.

Pasw original: 123456 -> md5(pasw) 5'00 veces -> abcdadcasdada

Si por casualidad abcdadcasdada coincide que es el md5( "a" ) una sola vez, no consiguen nada, porque la contraseña original sigue siendo 123456 aunque por fuerza bruta hayas sacado el "a".
 
Como ya dije las contraseñas se pueden repetir, y a lo mejor: 'sdfdhferwioh4eio' encriptado 500 veces coincide con el hash de 'a' una sola vez (es un ejemplo, no se con cual coincide 'a'), pero te digo que es inútil, la única forma es usar dos encriptaciones diferentes y guardarlas y comprobar si ambas coinciden, eso es lo más seguro que hay.

36 elevado a 20 son 11882217367861096949190085312512 (Ya da cualquier cosa elevándolo a más)

En teoría se repetiría, pero solo en teoría, para encontrar dicha coincidencia sería más fácil hacerle fuerza bruta a la posible contraseña que al hash...
 
Última edición:
36 elevado a 20 son 11882217367861096949190085312512 (Ya da cualquier cosa elevándolo a más)

En teoría se repetiría, pero solo en teoría, para encontrar dicha coincidencia sería más fácil hacerle fuerza bruta a la posible contraseña que al hash...
Lo que es seguro es que tanto si la contraseña es 8183849;#-38€+83€+27€-€82-"83!"+3(292738€+"8€(9291829 como si es jsjexkue y hay doble encriptación y intentas 32^x (no lo recuerdo) intentos la consigues seguro. Por ello estoy haciendo una librería de hashes md5 y sha1, cuando la de md5 llegue a esa cantidad no habrá hash que se resista:
7a65fede2cc58e2fbb816b9201936876.png
 
Última edición:
Que yo sepa y como comenta un compañero, MD5 es un sistema solo de IDA, pero ciertamente es recomendable el método que aporta irwin
 
Usa MD5 y el resultado mezclalo con otra cadena que generes al azar usando un script propio, luego a esa cadena final, vuelve a meterle md5 y vuelve a generar otra cadena y vuelve a unir todo, y para desencriptar la clave, solo haces el proceso a la inversa xd
 
Usa MD5 y el resultado mezclalo con otra cadena que generes al azar usando un script propio, luego a esa cadena final, vuelve a meterle md5 y vuelve a generar otra cadena y vuelve a unir todo, y para desencriptar la clave, solo haces el proceso a la inversa xd
Cuando consigas desencriptar MD5 voy y te beso los pies. Y cuando digo desencriptar me refiero a desencriptar, no buscar en bases de datos ni a fuerza bruta.
La forma más segura que se me ocurre es insertar varias contraseñas, en la columna poner por ejemplo una de sha1, una de md5 y otra de lo que quieras, así bajas las posibilidades de que se repita el hash a practicamente nulas.
Me explico:
Si por ejemplo 'a' en MD5 es ifdjhgvbi0he3490gh5g45379g3458tg9
y 'gheufgreuifgg389rg480tg4380tg8403gt0843gt45803gf345eg54yh465t64t' en MD5 es ifdjhgvbi0he3490gh5g45379g3458tg9 (lo mismo que 'a')
eso sería que el hash coincide (y efectivamente y como ya expliqué en otra respuesta de este mismo post, es completamente posible que eso pase, y también es posible que pase con una contraseña más fácil que la tuya).
En SHA1 puede pasar lo mismo, pero la encriptación es diferente, vamos, que lo que se repite en MD5 no tiene por que repetirse (digo no tiene por que por que hay un 0,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001% de que pase, me he inventado los ceros pero por ahí andará la cosa).
Con eso lo que quiero decir es que si insertas las dos contraseñas por separado, hay muchas menos posibilidades de que coincida una repetición, y de esa forma si tu contraseña es super avanzada les costará mucho sacarla a fuerza bruta.
Lo que no sirve es sha1(md5()) por que si se repite el md5, el sha1 también se repetirá por lo que sería lo mismo que solo usar md5().
De todos modos, si que es cierto que al menos la contraseña quedará más oculta si por ejemplo le añades una larga sal, así si lo usan en otra web, al menos si han acertado una repetición por fuerza bruta en vez de la original, no tendrán peligro.
 
Cuando consigas desencriptar MD5 voy y te beso los pies. Y cuando digo desencriptar me refiero a desencriptar, no buscar en bases de datos ni a fuerza bruta.
La forma más segura que se me ocurre es insertar varias contraseñas, en la columna poner por ejemplo una de sha1, una de md5 y otra de lo que quieras, así bajas las posibilidades de que se repita el hash a practicamente nulas.
Me explico:
Si por ejemplo 'a' en MD5 es ifdjhgvbi0he3490gh5g45379g3458tg9
y 'gheufgreuifgg389rg480tg4380tg8403gt0843gt45803gf345eg54yh465t64t' en MD5 es ifdjhgvbi0he3490gh5g45379g3458tg9 (lo mismo que 'a')
eso sería que el hash coincide (y efectivamente y como ya expliqué en otra respuesta de este mismo post, es completamente posible que eso pase, y también es posible que pase con una contraseña más fácil que la tuya).
En SHA1 puede pasar lo mismo, pero la encriptación es diferente, vamos, que lo que se repite en MD5 no tiene por que repetirse (digo no tiene por que por que hay un 0,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001% de que pase, me he inventado los ceros pero por ahí andará la cosa).
Con eso lo que quiero decir es que si insertas las dos contraseñas por separado, hay muchas menos posibilidades de que coincida una repetición, y de esa forma si tu contraseña es super avanzada les costará mucho sacarla a fuerza bruta.
Lo que no sirve es sha1(md5()) por que si se repite el md5, el sha1 también se repetirá por lo que sería lo mismo que solo usar md5().
De todos modos, si que es cierto que al menos la contraseña quedará más oculta si por ejemplo le añades una larga sal, así si lo usan en otra web, al menos si han acertado una repetición por fuerza bruta en vez de la original, no tendrán peligro.

Lo que yo dije es 100% posible, si haces un script encriptador para encriptar la clave y guardarla a la base de datos y otro que haría lo mismo para encriptar la clave recibida al loguearse, por ejemplo:

el usuario se registra y escribe una clave al darle guardar, el script transforma la clave a md5, luego la une a una cadena generada por otro script, luego todo eso lo transforma a md5 y lo une a otra cadena y lo guarda en la BD.

Ahora cuando el usuario quiera loguearse, simplemente habría que coger la clave y hacer el mismo proceso de arriba, si la clave es la correcta, el resultado seria el mismo que el de la BD y ahí solo se haría una comparación y si son iguales, pues se da acceso al sistema.

Haciéndolo de esta forma si alguien tiene acceso a la BD y a las contraseñas, no podrían descifrarlas nunca, porque serian una mezcla de MD5 mas una cadena generada por un script propio, el cual no conocen y para conocerlo tendrían que tener acceso a todos los archivos del sistema y estudiar el script que genera la cadena.

A eso me refería con encriptar y desencriptar, aunque en realidad solo encriptas dos veces y comparas.
 
Lo que yo dije es 100% posible, si haces un script encriptador para encriptar la clave y guardarla a la base de datos y otro que haría lo mismo para encriptar la clave recibida al loguearse, por ejemplo:

el usuario se registra y escribe una clave al darle guardar, el script transforma la clave a md5, luego la une a una cadena generada por otro script, luego todo eso lo transforma a md5 y lo une a otra cadena y lo guarda en la BD.

Ahora cuando el usuario quiera loguearse, simplemente habría que coger la clave y hacer el mismo proceso de arriba, si la clave es la correcta, el resultado seria el mismo que el de la BD y ahí solo se haría una comparación y si son iguales, pues se da acceso al sistema.

Haciéndolo de esta forma si alguien tiene acceso a la BD y a las contraseñas, no podrían descifrarlas nunca, porque serian una mezcla de MD5 mas una cadena generada por un script propio, el cual no conocen y para conocerlo tendrían que tener acceso a todos los archivos del sistema y estudiar el script que genera la cadena.

A eso me refería con encriptar y desencriptar, aunque en realidad solo encriptas dos veces y comparas.
Es que no lo habías explicado así (o no me lo ha parecido), pensaba que pretendias desencriptar el MD5 a posteriori xD
 

Temas similares

Atrás
Arriba