Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: twoz en 7 Diciembre 2009, 00:39 am



Título: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: twoz en 7 Diciembre 2009, 00:39 am
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 ;-)


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: ^Tifa^ en 7 Diciembre 2009, 00:58 am
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  ;)


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: djtuxy en 7 Diciembre 2009, 03:11 am
cifra con md5 o crea un aforma vos mismo, saludos ;)


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: twoz en 7 Diciembre 2009, 11:38 am
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


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: Novlucker en 7 Diciembre 2009, 11:52 am
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


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: twoz en 7 Diciembre 2009, 12:25 pm
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.


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: дٳŦ٭ en 7 Diciembre 2009, 19:03 pm
cifrado en php para todos los gustos
http://foro.codigosweb.net/php/encriptacion_en_php_para_todos_los_gustos-t424.0.html

Código
  1. <?php
  2. function rhex($num) {
  3.    $hex_chr = "0123456789abcdef";
  4.    $str = "";
  5.    for($j = 0; $j <= 3; $j++)
  6.        $str .= substr($hex_chr, ($num >> ($j * 8 + 4)) & 0x0F, 1) . substr($hex_chr, ($num >> ($j * 8)) & 0x0F, 1);
  7.    return $str;
  8. }
  9. function str2blks_MD5($str) {
  10.    $nblk = ((strlen($str) + 8) >> 6) + 1;
  11.    for($i = 0; $i < $nblk * 16; $i++) $blks[$i] = 0;
  12.    for($i = 0; $i < strlen($str); $i++)
  13.        $blks[$i >> 2] |= ord(substr($str, $i, 1)) << (($i % 4) * 8);
  14.    $blks[$i >> 2] |= 0x80 << (($i % 4) * 8);
  15.    $blks[$nblk * 16 - 2] = strlen($str) * 8;
  16.    return $blks;
  17. }
  18. function add($x, $y) {
  19.    $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
  20.    $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
  21.    return ($msw << 16) | ($lsw & 0xFFFF);
  22. }
  23. function rol($num, $cnt) {
  24.    return ($num << $cnt) | zeroFill($num, 32 - $cnt);
  25. }
  26. function zeroFill($a, $b) {
  27.    $bin = decbin($a);
  28.    if (strlen($bin) < $b) $bin = 0;
  29.    else $bin = substr($bin, 0, strlen($bin) - $b);
  30.    for ($i=0; $i < $b; $i++) {
  31.        $bin = "0".$bin;
  32.    }
  33.    return bindec($bin);
  34. }
  35. function cmn($q, $a, $b, $x, $s, $t) {
  36.    return add(rol(add(add($a, $q), add($x, $t)), $s), $b);
  37. }
  38. function ff($a, $b, $c, $d, $x, $s, $t) {
  39.    return cmn(($b & $c) | ((~$b) & $d), $a, $b, $x, $s, $t);
  40. }
  41. function gg($a, $b, $c, $d, $x, $s, $t) {
  42.    return cmn(($b & $d) | ($c & (~$d)), $a, $b, $x, $s, $t);
  43. }
  44. function hh($a, $b, $c, $d, $x, $s, $t) {
  45.    return cmn($b ^ $c ^ $d, $a, $b, $x, $s, $t);
  46. }
  47. function ii($a, $b, $c, $d, $x, $s, $t) {
  48.    return cmn($c ^ ($b | (~$d)), $a, $b, $x, $s, $t);
  49. }
  50. function md5p($str) {
  51.  $x = str2blks_MD5($str);
  52.  $a =  1732584193;
  53.  $b = -271733879;
  54.  $c = -1732584194;
  55.  $d =  271733878;
  56.  
  57.  for($i = 0; $i < sizeof($x); $i += 16) {
  58.    $olda = $a;
  59.    $oldb = $b;
  60.    $oldc = $c;
  61.    $oldd = $d;
  62.  
  63.    $a = ff($a, $b, $c, $d, $x[$i+ 0], 7 , -680876936);
  64.    $d = ff($d, $a, $b, $c, $x[$i+ 1], 12, -389564586);
  65.    $c = ff($c, $d, $a, $b, $x[$i+ 2], 17,  606105819);
  66.    $b = ff($b, $c, $d, $a, $x[$i+ 3], 22, -1044525330);
  67.    $a = ff($a, $b, $c, $d, $x[$i+ 4], 7 , -176418897);
  68.    $d = ff($d, $a, $b, $c, $x[$i+ 5], 12,  1200080426);
  69.    $c = ff($c, $d, $a, $b, $x[$i+ 6], 17, -1473231341);
  70.    $b = ff($b, $c, $d, $a, $x[$i+ 7], 22, -45705983);
  71.    $a = ff($a, $b, $c, $d, $x[$i+ 8], 7 ,  1770035416);
  72.    $d = ff($d, $a, $b, $c, $x[$i+ 9], 12, -1958414417);
  73.    $c = ff($c, $d, $a, $b, $x[$i+10], 17, -42063);
  74.    $b = ff($b, $c, $d, $a, $x[$i+11], 22, -1990404162);
  75.    $a = ff($a, $b, $c, $d, $x[$i+12], 7 ,  1804603682);
  76.    $d = ff($d, $a, $b, $c, $x[$i+13], 12, -40341101);
  77.    $c = ff($c, $d, $a, $b, $x[$i+14], 17, -1502002290);
  78.    $b = ff($b, $c, $d, $a, $x[$i+15], 22,  1236535329);
  79.  
  80.    $a = gg($a, $b, $c, $d, $x[$i+ 1], 5 , -165796510);
  81.    $d = gg($d, $a, $b, $c, $x[$i+ 6], 9 , -1069501632);
  82.    $c = gg($c, $d, $a, $b, $x[$i+11], 14,  643717713);
  83.    $b = gg($b, $c, $d, $a, $x[$i+ 0], 20, -373897302);
  84.    $a = gg($a, $b, $c, $d, $x[$i+ 5], 5 , -701558691);
  85.    $d = gg($d, $a, $b, $c, $x[$i+10], 9 ,  38016083);
  86.    $c = gg($c, $d, $a, $b, $x[$i+15], 14, -660478335);
  87.    $b = gg($b, $c, $d, $a, $x[$i+ 4], 20, -405537848);
  88.    $a = gg($a, $b, $c, $d, $x[$i+ 9], 5 ,  568446438);
  89.    $d = gg($d, $a, $b, $c, $x[$i+14], 9 , -1019803690);
  90.    $c = gg($c, $d, $a, $b, $x[$i+ 3], 14, -187363961);
  91.    $b = gg($b, $c, $d, $a, $x[$i+ 8], 20,  1163531501);
  92.    $a = gg($a, $b, $c, $d, $x[$i+13], 5 , -1444681467);
  93.    $d = gg($d, $a, $b, $c, $x[$i+ 2], 9 , -51403784);
  94.    $c = gg($c, $d, $a, $b, $x[$i+ 7], 14,  1735328473);
  95.    $b = gg($b, $c, $d, $a, $x[$i+12], 20, -1926607734);
  96.  
  97.    $a = hh($a, $b, $c, $d, $x[$i+ 5], 4 , -378558);
  98.    $d = hh($d, $a, $b, $c, $x[$i+ 8], 11, -2022574463);
  99.    $c = hh($c, $d, $a, $b, $x[$i+11], 16,  1839030562);
  100.    $b = hh($b, $c, $d, $a, $x[$i+14], 23, -35309556);
  101.    $a = hh($a, $b, $c, $d, $x[$i+ 1], 4 , -1530992060);
  102.    $d = hh($d, $a, $b, $c, $x[$i+ 4], 11,  1272893353);
  103.    $c = hh($c, $d, $a, $b, $x[$i+ 7], 16, -155497632);
  104.    $b = hh($b, $c, $d, $a, $x[$i+10], 23, -1094730640);
  105.    $a = hh($a, $b, $c, $d, $x[$i+13], 4 ,  681279174);
  106.    $d = hh($d, $a, $b, $c, $x[$i+ 0], 11, -358537222);
  107.    $c = hh($c, $d, $a, $b, $x[$i+ 3], 16, -722521979);
  108.    $b = hh($b, $c, $d, $a, $x[$i+ 6], 23,  76029189);
  109.    $a = hh($a, $b, $c, $d, $x[$i+ 9], 4 , -640364487);
  110.    $d = hh($d, $a, $b, $c, $x[$i+12], 11, -421815835);
  111.    $c = hh($c, $d, $a, $b, $x[$i+15], 16,  530742520);
  112.    $b = hh($b, $c, $d, $a, $x[$i+ 2], 23, -995338651);
  113.  
  114.    $a = ii($a, $b, $c, $d, $x[$i+ 0], 6 , -198630844);
  115.    $d = ii($d, $a, $b, $c, $x[$i+ 7], 10,  1126891415);
  116.    $c = ii($c, $d, $a, $b, $x[$i+14], 15, -1416354905);
  117.    $b = ii($b, $c, $d, $a, $x[$i+ 5], 21, -57434055);
  118.    $a = ii($a, $b, $c, $d, $x[$i+12], 6 ,  1700485571);
  119.    $d = ii($d, $a, $b, $c, $x[$i+ 3], 10, -1894986606);
  120.    $c = ii($c, $d, $a, $b, $x[$i+10], 15, -1051523);
  121.    $b = ii($b, $c, $d, $a, $x[$i+ 1], 21, -2054922799);
  122.    $a = ii($a, $b, $c, $d, $x[$i+ 8], 6 ,  1873313359);
  123.    $d = ii($d, $a, $b, $c, $x[$i+15], 10, -30611744);
  124.    $c = ii($c, $d, $a, $b, $x[$i+ 6], 15, -1560198380);
  125.    $b = ii($b, $c, $d, $a, $x[$i+13], 21,  1309151649);
  126.    $a = ii($a, $b, $c, $d, $x[$i+ 4], 6 , -145523070);
  127.    $d = ii($d, $a, $b, $c, $x[$i+11], 10, -1120210379);
  128.    $c = ii($c, $d, $a, $b, $x[$i+ 2], 15,  718787259);
  129.    $b = ii($b, $c, $d, $a, $x[$i+ 9], 21, -343485551);
  130.  
  131.        $a = add($a, $olda);
  132.        $b = add($b, $oldb);
  133.        $c = add($c, $oldc);
  134.        $d = add($d, $oldd);
  135.    }
  136.    return rhex($a) . rhex($b) . rhex($c) . rhex($d);
  137. }
  138. echo md5p('word');//Generado manualmente
  139. echo "\r\n<br />".md5('word');//Generado con PHP
  140. ?>
  141.  


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: SKuLLKiD_ en 17 Diciembre 2009, 21:10 pm
"admin" cifrado en mysql: 21232f297a57a5a
"admin" cifrado en php:    21232f297a57a5a743894a0e4a801fc3

¿Qué longitud tiene el campo varchar de la contraseña en MySQL?


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: alcatel en 17 Diciembre 2009, 22:06 pm
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.


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: SKuLLKiD_ en 18 Diciembre 2009, 21:01 pm
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.


Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: ^Tifa^ en 25 Diciembre 2009, 04:48 am
Hola.

Efectivamente SKuLLKiD de acuerdo contigo  :D  me parece que la longitud que el le definio al campo es menor que lo que soporta y lo esta cortando. Dale una longitud mayor, y no uses ese campo de indice!

Asi el tipo de dato no te cortara la palabra cifrada con MD5  ;)



Título: Re: php vs mysql, ¿cual es la mejor forma de cifrar contraseñas?
Publicado por: [u]nsigned en 26 Diciembre 2009, 20:18 pm
Bueno el user ya resolvió su problema, pero quería agregar que a partir de PHP 5, la función md5() posee el parametro opcional "modo binario" (que por defecto es FALSE). Pero de usarse como TRUE el hash resultante es de 16 caracteres y en formato binario.

Citar
Código
  1. <? echo md5("unsigned")?>
343fee95d31373c80d5bdb2b8c57f8c5

Citar
Código
  1. <? echo md5("unsigned", 1)?>
4?﨣モsネ [ロ+係

Saludos