php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?

Iniciado por twoz, 7 Diciembre 2009, 00:39 AM

0 Miembros y 1 Visitante están viendo este tema.

twoz

viendo algunos temas por ahi, me ha entrado la duda sobre la forma de cifrar las contraseñas, si es mejor hacerlo con md5, si es mejor hacerlo en el php o mysql, etc.

yo en principio tenia pensado obtener la contrseña mediante un form, y luego aplicar la funcion md5 en php o en mysql indistintamente, pero haciendo pruebas, añadi una pass con desde mysql con md5, y luego desde php saque el valor que obtendria esa misma palabra con la funcion md5 de php y el caso es que coinciden pero solo en parte, la contraseña que obtengo de mysql tiene la mitad de longitud que la que obtengo directamente desde php...

Esto porque es? no se supone que deberia de obtener la misma cadena de texto haciendolo desde php que desde mysql? como puede ser desde php el doble de largo? :S

a raiz de eso, he estado buscando y e visto que hay quien recomienda utilizar la funcion de mysql pasword() en lugar de md5, como es la primera vez que hago algo con esto, pues ya no se ni donde meterme  :laugh: porque en todos los sitios dicen como hacer tal o cual, pero en ninguno dicen que es mejor xD

asique despues de todo ese tochazo, lanzo mi pregunta, ¿como cifro las contraseñas? desde php o mysql, y sea de donde sea, ¿las cifro a través de md5() o de password()?

un saludo, y gracias por las respuestas ;-)

^Tifa^

En ningun sitio pueden decirte cual es la mejor opcion porque eso es algo ya personal  ;)  y para evitar disputas entre usuarios unos fanaticos de una cosa y otros de la otra... pues lo ideal es dar la caracteristica de cada asunto, y que el usuario particularmente seleccione cual le conviene.

Yo si fuese tu, elegiria cifrar las contrasenas con la funcion md5 dentro de MySQL en vez del codigo php. Mi razon? sencillamente si alguien te hace algun SQL injection o alguien obtiene o tiene acceso alguna vez a tu base de datos mysql podra ver en texto plano las contrasenas de los usuarios (sino estan encriptadas) que aunque cubras esto mediante codigo php sera exclusivamente solo para acceso web, pero si alguien obtiene cosas de la base de datos? aqui como impides que vea en texto no plano datos importantes?

Es solo mi humilde opinion, cada uno tendra la suya propia como te digo  ;)

djtuxy



Web | Foro

twoz

gracias por las respuestas, el caso tifa, es que mi idea seria guardar las contraseñas encriptadas en la base de datos, el problema estaba en cuando encriptarlas, porque dejo un ejemplo:

como estaba trasteando con la cuenta de admin, pues he probado a cifrar esa cuenta, y eso es lo que me aparece:
"admin" cifrado en mysql: 21232f297a57a5a
"admin" cifrado en php:    21232f297a57a5a743894a0e4a801fc3

se puede ver que son identicas  pero la codificada con php es mas larga, lo que no se si significa que sea más fuerte o que resista mejor un intento de desencriptarla si entrasen en mi base de datos.

un saludo

Novlucker

No se cual sea el problema, pero la que te devuelve mysql esta mal, deberían de ser 32 caracteres como la que te devuelve php :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

twoz

#5
la inserte a través de phpmyadmin, puede que ahí este el problema, voy a insertar un nuevo usuario desde la consola directamente, a ver que aparece.

ahora pongo los resultados

edit:

vale, he insertado un nuevo usuario de la siguiente manera, insert into usuarios (usuario,pass) values ("usuario1", md5("admin"));

y me sigue dando la misma longitud de caracteres, no se porque sera esto, pero con lo que me dices novlucker lo que voy a hacer es codificar desde php y enviar la contraseña ya codificada a mysql.

emmm...  :silbar: vuelvo a editar, y esque acabo de leer que obviamente es necesario un campo de 32 caracteres... y yo al crear la tabla la cree pensando en el numero de caracteres de la contraseña, no del hash resultante, por lo que talves esa falta de caracteres se deba a que no hay espacio, voy a crear todo de nuevo y cuento.

again! edito  :xD he aumentado el valor del campo a 32 y ya obtengo la misma codificación md5 desde php que desde mysql.
ahora ya solo me queda decidir si codificar desde php o mysql, y ponerme a mirar sobre ssl, para que la trasnmision hasta el servidor sea fiable :D
gracias por las respuestas.

дٳŦ٭

cifrado en php para todos los gustos
http://foro.codigosweb.net/php/encriptacion_en_php_para_todos_los_gustos-t424.0.html

Código (php) [Seleccionar]

<?php
function rhex($num) {
    
$hex_chr "0123456789abcdef";
    
$str "";
    for(
$j 0$j <= 3$j++)
        
$str .= substr($hex_chr, ($num >> ($j 4)) & 0x0F1) . substr($hex_chr, ($num >> ($j 8)) & 0x0F1);
    return 
$str;
}
function 
str2blks_MD5($str) {
    
$nblk = ((strlen($str) + 8) >> 6) + 1;
    for(
$i 0$i $nblk 16$i++) $blks[$i] = 0;
    for(
$i 0$i strlen($str); $i++)
        
$blks[$i >> 2] |= ord(substr($str$i1)) << (($i 4) * 8);
    
$blks[$i >> 2] |= 0x80 << (($i 4) * 8);
    
$blks[$nblk 16 2] = strlen($str) * 8;
    return 
$blks;
}
function 
add($x$y) {
    
$lsw = ($x 0xFFFF) + ($y 0xFFFF);
    
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
    return (
$msw << 16) | ($lsw 0xFFFF);
}
function 
rol($num$cnt) {
    return (
$num << $cnt) | zeroFill($num32 $cnt);
}
function 
zeroFill($a$b) {
    
$bin decbin($a);
    if (
strlen($bin) < $b$bin 0;
    else 
$bin substr($bin0strlen($bin) - $b);
    for (
$i=0$i $b$i++) {
        
$bin "0".$bin;
    }
    return 
bindec($bin);
}
function 
cmn($q$a$b$x$s$t) {
    return 
add(rol(add(add($a$q), add($x$t)), $s), $b);
}
function 
ff($a$b$c$d$x$s$t) {
    return 
cmn(($b $c) | ((~$b) & $d), $a$b$x$s$t);
}
function 
gg($a$b$c$d$x$s$t) {
    return 
cmn(($b $d) | ($c & (~$d)), $a$b$x$s$t);
}
function 
hh($a$b$c$d$x$s$t) {
    return 
cmn($b $c $d$a$b$x$s$t);
}
function 
ii($a$b$c$d$x$s$t) {
    return 
cmn($c ^ ($b | (~$d)), $a$b$x$s$t);
}
function 
md5p($str) {
  
$x str2blks_MD5($str);
  
$a =  1732584193;
  
$b = -271733879;
  
$c = -1732584194;
  
$d =  271733878;

  for(
$i 0$i sizeof($x); $i += 16) {
    
$olda $a;
    
$oldb $b;
    
$oldc $c;
    
$oldd $d;

    
$a ff($a$b$c$d$x[$i0], , -680876936);
    
$d ff($d$a$b$c$x[$i1], 12, -389564586);
    
$c ff($c$d$a$b$x[$i2], 17,  606105819);
    
$b ff($b$c$d$a$x[$i3], 22, -1044525330);
    
$a ff($a$b$c$d$x[$i4], , -176418897);
    
$d ff($d$a$b$c$x[$i5], 12,  1200080426);
    
$c ff($c$d$a$b$x[$i6], 17, -1473231341);
    
$b ff($b$c$d$a$x[$i7], 22, -45705983);
    
$a ff($a$b$c$d$x[$i8], ,  1770035416);
    
$d ff($d$a$b$c$x[$i9], 12, -1958414417);
    
$c ff($c$d$a$b$x[$i+10], 17, -42063);
    
$b ff($b$c$d$a$x[$i+11], 22, -1990404162);
    
$a ff($a$b$c$d$x[$i+12], ,  1804603682);
    
$d ff($d$a$b$c$x[$i+13], 12, -40341101);
    
$c ff($c$d$a$b$x[$i+14], 17, -1502002290);
    
$b ff($b$c$d$a$x[$i+15], 22,  1236535329);

    
$a gg($a$b$c$d$x[$i1], , -165796510);
    
$d gg($d$a$b$c$x[$i6], , -1069501632);
    
$c gg($c$d$a$b$x[$i+11], 14,  643717713);
    
$b gg($b$c$d$a$x[$i0], 20, -373897302);
    
$a gg($a$b$c$d$x[$i5], , -701558691);
    
$d gg($d$a$b$c$x[$i+10], ,  38016083);
    
$c gg($c$d$a$b$x[$i+15], 14, -660478335);
    
$b gg($b$c$d$a$x[$i4], 20, -405537848);
    
$a gg($a$b$c$d$x[$i9], ,  568446438);
    
$d gg($d$a$b$c$x[$i+14], , -1019803690);
    
$c gg($c$d$a$b$x[$i3], 14, -187363961);
    
$b gg($b$c$d$a$x[$i8], 20,  1163531501);
    
$a gg($a$b$c$d$x[$i+13], , -1444681467);
    
$d gg($d$a$b$c$x[$i2], , -51403784);
    
$c gg($c$d$a$b$x[$i7], 14,  1735328473);
    
$b gg($b$c$d$a$x[$i+12], 20, -1926607734);

    
$a hh($a$b$c$d$x[$i5], , -378558);
    
$d hh($d$a$b$c$x[$i8], 11, -2022574463);
    
$c hh($c$d$a$b$x[$i+11], 16,  1839030562);
    
$b hh($b$c$d$a$x[$i+14], 23, -35309556);
    
$a hh($a$b$c$d$x[$i1], , -1530992060);
    
$d hh($d$a$b$c$x[$i4], 11,  1272893353);
    
$c hh($c$d$a$b$x[$i7], 16, -155497632);
    
$b hh($b$c$d$a$x[$i+10], 23, -1094730640);
    
$a hh($a$b$c$d$x[$i+13], ,  681279174);
    
$d hh($d$a$b$c$x[$i0], 11, -358537222);
    
$c hh($c$d$a$b$x[$i3], 16, -722521979);
    
$b hh($b$c$d$a$x[$i6], 23,  76029189);
    
$a hh($a$b$c$d$x[$i9], , -640364487);
    
$d hh($d$a$b$c$x[$i+12], 11, -421815835);
    
$c hh($c$d$a$b$x[$i+15], 16,  530742520);
    
$b hh($b$c$d$a$x[$i2], 23, -995338651);

    
$a ii($a$b$c$d$x[$i0], , -198630844);
    
$d ii($d$a$b$c$x[$i7], 10,  1126891415);
    
$c ii($c$d$a$b$x[$i+14], 15, -1416354905);
    
$b ii($b$c$d$a$x[$i5], 21, -57434055);
    
$a ii($a$b$c$d$x[$i+12], ,  1700485571);
    
$d ii($d$a$b$c$x[$i3], 10, -1894986606);
    
$c ii($c$d$a$b$x[$i+10], 15, -1051523);
    
$b ii($b$c$d$a$x[$i1], 21, -2054922799);
    
$a ii($a$b$c$d$x[$i8], ,  1873313359);
    
$d ii($d$a$b$c$x[$i+15], 10, -30611744);
    
$c ii($c$d$a$b$x[$i6], 15, -1560198380);
    
$b ii($b$c$d$a$x[$i+13], 21,  1309151649);
    
$a ii($a$b$c$d$x[$i4], , -145523070);
    
$d ii($d$a$b$c$x[$i+11], 10, -1120210379);
    
$c ii($c$d$a$b$x[$i2], 15,  718787259);
    
$b ii($b$c$d$a$x[$i9], 21, -343485551);

        
$a add($a$olda);
        
$b add($b$oldb);
        
$c add($c$oldc);
        
$d add($d$oldd);
    }
    return 
rhex($a) . rhex($b) . rhex($c) . rhex($d);
}
echo 
md5p('word');//Generado manualmente
echo "\r\n<br />".md5('word');//Generado con PHP
?>



Con sangre andaluza :)


SKuLLKiD_

Cita de: thzneas en  7 Diciembre 2009, 11:38 AM
"admin" cifrado en mysql: 21232f297a57a5a
"admin" cifrado en php:    21232f297a57a5a743894a0e4a801fc3

¿Qué longitud tiene el campo varchar de la contraseña en MySQL?
Me duele el fémur, pero no me importa. Tengo un camión.

alcatel

Yo pensaba que el algoritmo de cifrado de md5 es el mismo para mysql que para php... pensaba que me daba igual quien lo hacía. Personalmente prefiero que lo haga php. Si la base de datos tiene mucha carga pues prefiero no ejecutar funciones en las SQL.

Lo del tamaño de almacenamiento... pues md5 tiene una longitud de 128  caracteres y un varchar hasta 255... Igual me equivoco. No se casi nada de bases de datos.
Sin rebote no hay jugada.

SKuLLKiD_

No, si las contraseñas se guardan encriptadas en un varchar, pero si la longitud es más pequeña de la cuenta pues te la corta. Tiene toda la pinta de que es ese el problema.
Me duele el fémur, pero no me importa. Tengo un camión.