Seguridad con md5

p3rf3ctuz

buenas,
yo siempre e usado en php el algoritmo md5 para encriptar las contraseñas.
http://es2.php.net/manual/es/function.md5.php

Acabo de leer en wikipedia q parece ser q no es seguro del todo.
http://es.wikipedia.org/wiki/MD5#Seguridad

Vosotros usáis md5 o al contrario preferís algún otro?
sha1? xd -> http://es.php.net/manual/es/function.sha1.php

B

http://www.lamateporunyogur.net/archivos/2006/06/01/claves-poco-seguras-en-md5/

SeiYa

Si por el motivo que sea te roban un hash por fuerza bruta van a poder sacarlo, peeero hay varias soluciones:

Siempre puedes a la contraseña del usuario añadirle dos caracteres al principio, dos al final y generar el hash de eso, o dos números sin más, o aplicar 3 veces el md5 ... en fin hay varias opciones. El md5 sin más puede resultar inseguro si te roban los hashes, sino es como cualquier otro método y si te roban los hashes siempre puedes intentar asegurarlos de alguna manera como te he dicho.

Hablo un poco del tema en:

http://www.wallack.es/Secciones/Noticias/encriptacion-de-contrasenas-segura.html

p3rf3ctuz

#3 muy interesante tu articulo ese, yo no conocía las tablas esas arcoiris... :S

gracias, haré eso de la triple encriptación o sino combino el md5 con el sha1

SeiYa

Puedes hacer también 1 md5 luego concatenas una a al principio y otra al final del md5 y haces otro md5 y luego concatenas una e y otra e y otro md5 XD en fin, posibilidades mil el miembro viril.

kas

Que yo sepa hoy en dia es inseguro hasta el RSA.

Yo estoy usando RSA de 4096bytes de longitud para negociaciony Rijndael para datos grandes.

javithelong

RSA inseguro... hombre... hasta cierto punto
Vamos, que si no eres dueño de un banco mundial no te preocupes porque nadie vaya a jakearte un RSA de 4kb.

Y AES... pos... es más jakeable, pero si pones claves aleatorias (negociadas con RSA) y las conversaciones duran menos de varios días, no hay problema.

PD: Creo que usarás 4k bits, de longitud de clave, 4 k Bytes es una animalada

shortyStyle

Gracias por la información, implementaré tres veces la función md5, interesante ^^

LOc0

#8
Yo te recomiendo que cuando vayas a GUARDAR la password en la base de datos generes una cadena aleatoria de 10 caracteres y hagas lo siguiente:

$hash_tocho=md5(md5("password").md5($CADENA_ALEATORIA));

En la base de datos guarda la CADENA_ALEATORIA y el HASH TOCHO Las próximas veces que quieras comprobar la password sacas de la base de datos la cadena aleatoria que guardaste, haces la operación de arriba y lo enfrentas al HASH que tb guardaste.

Si no quieres añadir la cadena aleatoria y prefieres hacer md5 varias veces, no hagas público las veces que ejecutas md5() ya que si no es como si sólo lo hicieras una vez. (De cara a un hipotético ataque por fuerza bruta).

Salu2 ;)

PD: Si tienes opción de usar SHA-1 o RIPEMD-160 mejor.

SeiYa

O sino que haga:

md5("aa".md5("bb".md5(password)."bb")."aa);

No se si se concatenaba así pero bueno.

javithelong

Por cierto, ya hablando del tema del post... ¿porqué os obsesionais tanto con la seguridad?

Esta bien que os informeis y tal, pero... creedme, a menos que tengais un negocio bastante grande, un simple md5 sobra para guardar las contraseñas (no te digo ya para una web en php sobre un clan de cs o algo así)

SeiYa

No es una obsesión ni mucho menos pero yo por ejemplo me rijo por una máxima.

O lo haces bien o no lo haces.

Los demás no se yo que harán XD

javithelong

Tengo mañana examen de criptografía y me estais tocando la fibra xDDD

El éxito de un sistema de cifrado debe basarse en su clave, no en el método (segun un tal kerchoff o algo asi). Si quereis un sistema seguro, ponle un MAC con clave de 50 caracteres con mayúsculas, minúsculas y números, y olvidate de que te la juankéen (ejemplo, frase célebre que te mole, o lo que sea).

http://es.wikipedia.org/wiki/Message_authentication_code

Montarse paranoias de esas de poner aa, bb, numeros aleatorios y demás, no aumenta significativamente el tiempo de juankearos, en comparación con aumentar la clave en 1 caracter.

Weno, marcho a estudiar, luego veo que me contestais :P

PD: editado que me he confundio de algoritmo xD

shortyStyle

#9 Siempre se puede poner una clave concatenada con una cadena con caracteres del tipo ! , ; : ? que solo el webmaster sepa, no había pensado en eso y tiene pinta de ser algo bastante seguro, el algorítmo para descifrar ese hash debe de tardar bastante tiempo en hacerlo, sobre todo cuantos más carácteres "raros" se le pongan.

Gracias de nuevo _

LOc0

¿Obsesión con la seguridad? Simplemente #12, pero reconozco que ser perfeccionista muchas veces resulta un lastre (no en este caso que la diferencia entre hacerlo bien o regular son un par de letras)...

En cuanto al tema del thread, añadir la cadena aleatoria al final SÍ mejora la seguridad (siempre que el algoritmo de hash esté bien diseñado y sobre todo tenga un rango de bits "amplio"), ya que al aumentar la longitud de la clave reduce las posibilidades de que se pueda encontrar la clave por fuerza bruta (haciendo md5(clave) con un programa hasta dar con una que coincida con el hash que tenemos). LO que NO se evita al añadir cadenas aleatorias o lo que sea es reducir el número de colisiones que son inevitables en los algoritmos de hash. (http://es.wikipedia.org/wiki/Ataque_de_cumplea%C3%B1os)

Salu2 ;)

PD: Si a alguno os gusta la criptografía os recomiendo bajar CRYPT TOOL de www.cryptool.org (Es un programa muuuuuuuuy interesante para aprender y comprender los entresijos de los principales métodos de cifrado. Desde clásicos como el cifrado del césar hasta Rinjdael).

javithelong

#15 Si haces esa ñapa que dices de meterle la cadena aleatoria, la tienes que guardar en la base de datos, y si la guardas en la base de datos, te la pueden juankear igual de bien, y si tienen la cadena aleatoria, romper por fuerza bruta el md5 es igual a que si no hubiera cadena. (Además, siempre puedes obligar a que las contraseñas tengan X caracteres mínimos, por lo que tu idea de poner una cadena aleatoria sigue sin convencerme :s)

De todas formas, para #1, se recomienda usar SHA-1, que tiene menos vulnerabilidades que md5 (aparte de 22 bits más de salida)

LOc0

#16
Yo no creo que sea una ñapa ( http://en.wikipedia.org/wiki/Salt_%28cryptography%29 ). Pero claro, si el supuesto "juáquer" tiene acceso a la base de datos pues apaga y vámonos (pero vamos, si el administrador no ha escogido una clave adecuada para la base de datos poca culpa de eso tiene MD5 o el que sea. Es como si cifras con AES-256, te entran a tu casa y te mangan la clave...).

Salu2 ;)

javithelong

El caso es que si acceden a la base de datos, el md5 se encarga de que el juanker no gane información, con los resultados de md5's no sabes absolutamente nada de lo que se usó para sacarlos.

(tengo el examen hoy a las 3, a ver si hay suerte :P)

kas

Creo que javi se refiere a que si guardas la contraseña con md5 + md5(randomString), luego cuando tengas que compararla, como lo haces?

Ese random string tendras que guardarlo tambien, porque si no no podras comparar la password que entren en cada login con la de la db.

Letto

Pero no tienes pq guardar ese "randomstring" en la base de datos.

Yo lo veo una manera fácil de aumentar la seguridad bastante ya que es difícil que te vayan a entrar al sistema de archivos y a la base de datos.

shortyStyle

#19 Pues algo así:

al guardar:

$password.stringquetuquieras=md5($password.stringquetuquieras);

y su respectivo insert en la db

y al recoger la password de la db para compararla en el login o algo lo mismo, si el te envia una password por POST a esa password que te ha enviado el le concatenas la string, que solo tú debes saber, y lo comparas con la password(con la string concatenada anteriormente) de la db y listo.

BlisZ

puedes darle la vuelta a la cadena, desordenar letras, pasar 2 veces el md5... hay 1000 maneras

SeiYa

Una muy buena es simplemente a todas las pass añadirles algo como:

¿*?$·"%·$%!"·!"· y pista, eso lo guardas directamente en el código y ya está, el hash de eso más su password no lo descifran ni patrás XD

LOc0

A ver, eligiendo adecuadamente las passwords de la BD y del FTP (y no habiendo cagadas gordas de sql-injection y derivados en los scripts) el "peligro" realmente está en los hashes MD5 que queden almacenados en las cookies.

Y efectivamente, en vez de generar un salt para cada registro se podría usar uno genérico incrustado directamente en el código, pero es que si acceden a la base de datos no veo por qué no podrían hacerlo al FTP...

Salu2 ;)

maRc

Preguntilla: si acceden a la base de datos, podría darse el caso de que también accedan a los propios scripts o programas que utilices, ¿no?

En ese caso, por mucha cadena rara que hagas, lo importante seguirá siendo que el hash sea más o menos seguro.

¿O estoy metiendo la pata?

SeiYa

#25 si acceden a la bbdd acceden a la bbdd... si tiene el mismo user y pass que el ftp mal vamos.

Si acceden al ftp o escondes muy bien la cadena de conexión a la base de datos o van a poder entrar también a la bbdd (si es que hay al menos un script que conecte).

javithelong

#20 Si no guardas ese 'randomstring' (vaya nombrecito xD) en la bd, ¿Cómo comparas luego que la contraseña es correcta? ¿Si la cadena es aleatoria para cada pw?

#23 Alargar la clave con algo asi... es efectivo hasta que alguien se entere de cual es ese 'alargue'. Luego es como si no existiera.

#25 Si acceden al ftp, pueden ver los scripts y demás que tengas (y de ahi pueden sacar tu usr y pw de la bd). Si la bd tiene permitidas conexiones desde fuera de localhost, te abren el culo.

Si acceden únicamente a la bd, solo pueden copiarse las tablas, todo tu código sigue seguro (quitando vistas y demás de la bd). Pueden ver toda la información que haya en tu bd.

Si los pw de los usuarios estan codificados con md5, verán una tabla en plan:

usr pw

pepe iho283odho83dh3o8de238
jose ocowhejfoijwe0984302j42
... ....

Con lo que no tendrán información de las pw de usuarios, gracias al md5.

#26 Te sorprenderías lo obvios que son muchos passwords de ftps y bds de por ahi (en plan admin-admin, y tal...).

En resumen, parece claro que cuanto más te enreveses, más le costará al juanker putearte, alargar claves, historias aleatorias, passwords largos. Todos parece que sabemos algo de informática, y como tales, todos sabemos que no existe el sistema 100% seguro.
En mi opinión, no merece enrevesarse tanto a menos que el nivel de seguridad requerido por la página sea muy alto (SeiYa, si solo haces las cosas bien... solo follas en noches de luna llena con casa+cama de 2x2, cena con champagne y fresas de postre? yo prefiero pinchar, aunque sea en el asiento de atrás del coche xD).
Ah, y ya que estais, usad SHA-1, que tiene una vulnerabilidad conocida menos que md5 (pese a que nadie vaya a intentar juankearos nunca)

Buf, que troncho, paso de releermelo, que lo borro entero. Vengo del examen y de beberme las típicas birras de después y ando un poco suelto :P

Buenas noches!!

SeiYa

#27 la casa la tengo y la cama no es de 2x2 pero es bastante grande.

La luna llena y lo demás es puro romanticismo, depende de lo que se quiera, si se quiere follar da igual el lugar, hacer el amor es otra cosa.

El sistema 100% seguro es el sistema excento de humanos o bien desconectado de internet :P

La cadena aleatoria global para todas las pass está claro que si te la descubren no vale para nada, pero para descubrirla "solo" deberían acceder al ftp, esto es que o ven el código de mis scripts o no tienen posibilidad alguna de descubrirla.

Sí, ya se que hay passwords muy generales, es más en http://www.phenoelit.de/dpl/dpl.html hay una lista de las contraseñas por defecto de todos los routers wifi o de la gran mayoría y creéme que si funciona que cuela hasta en los del corte inglés XD

Realmente, TODO aquel sistema protegido por contraseña está protegido por algo. A mi personalmente me da exactamente igual si lo que almacena son mensajes privados entre foreros o los datos bancarios de toda una ciudad. Un sistema protegido por contraseña tiene que ser 99,99% seguro (ese 0,01% es la acción divina) proteja lo que proteja.

Si tengo que hacer que el logeo o el sistema de identificación más complejo le haré y le haré único para cada sistema que desarrolle.

La seguridad es algo importantísimo sea para lo que sea, aunque en mi página web realmente importe una mierda lo que almecene, realmente es más trascendental que eso.

Una contraseña puede ser una cadena de caracteres privada o bien algo que te idenfitica, no se, para mi aunque la contraseña sirva para acceder a un forodemierda pondría el mismo nivel de seguridad que para una transacción bancaria.

Otra cosa, si acceden al ftp y pillan tus datos de conexión a la bd aunque esta solo permita la conexión a localhost, basta con subir un phpmyadmin al sitio web y configurarle con esos datos para tener contorl total de la web...

Es igual, que la duda esta creo que quedó resuelta ya, dejémonos de historias XD

Usuarios habituales

  • SeiYa
  • javithelong
  • LOc0
  • BlisZ
  • shortyStyle
  • kas
  • p3rf3ctuz