Foros del Web » Programando para Internet » PHP »

Pregunta sobre encriptacion

Estas en el tema de Pregunta sobre encriptacion en el foro de PHP en Foros del Web. He estado mirando mcrypt pero entre que ninguno de los codigos que e probado me a funcionado, ya que siempre mostraba caracteres extraños... y que ...
  #1 (permalink)  
Antiguo 21/08/2009, 12:14
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Pregunta Pregunta sobre encriptacion

He estado mirando mcrypt pero entre que ninguno de los codigos que e probado me a funcionado, ya que siempre mostraba caracteres extraños... y que segun e leido, no todos los servidores web tienen esta funcion activada en php... pues me a echado para atras.

Pero claro, viendo md5 y sha1 que realmente no encripta, son irreversibles y que son "faciles" de descifrar pues... ya no se que hacer.

¿Que me recomendais?
Es que mcrypt no e visto ningun codigo que me funcione correctametne, si alguien tiene algun ejemplo por ahi se lo agradeceria mucho.

Por otra parte... que opinais de una combinacion entre md5 y sha1 como por ejemplo...
$key = md5("Mi frase secreta que solo yo se");
$contrasena = md5("mipass");
$pwfinal = sha1(md5($contrasena . $key));
  #2 (permalink)  
Antiguo 21/08/2009, 12:25
 
Fecha de Ingreso: agosto-2009
Mensajes: 41
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Pregunta sobre encriptacion

hola, mira yo uso esta funcion para encriptar

RIJNDAEL_encrypt($numero, $key);

puedes buscar algunas referencias de ella, a lo mejor te sirva mejor
  #3 (permalink)  
Antiguo 21/08/2009, 14:14
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Pregunta Respuesta: Pregunta sobre encriptacion

Cita:
Iniciado por asor2303 Ver Mensaje
hola, mira yo uso esta funcion para encriptar

RIJNDAEL_encrypt($numero, $key);

puedes buscar algunas referencias de ella, a lo mejor te sirva mejor
Pero eso es otro algoritmo de encriptacion que tambien se tiene que usar con $td = mcrypt_module_open('rijndael-128', '', 'ecb', ''); no?

Ahora e encontrado una funcion php que encripta y desencripta con bastantes algoritmos diferentes a nuestra eleccion.
Modificandolo e conseguido que me funcione correctamente pero pero da estos resultados...


Encriptado: ‹Õ"'»[dY³´(™¯Ç’ÀòjúÈÚ×÷fãùî|ùŸ
Desencriptado: Esta es la frase oculta ole�����

¿Por que al desencriptar aparecen esas interrogaciones? ¿Porque la salida desencriptada tambien tiene que ser de 32 caracteres y lo rellena asi? ¿y para borrar esos caracteres y tomar la clave en limpio?
  #4 (permalink)  
Antiguo 21/08/2009, 14:59
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Respuesta: Pregunta sobre encriptacion

...y el resultado tampoco me lo inserta en la base de datos, la clave cifrada que genera es la siguiente �;��S�7

La consulta que genero es esta...
INSERT INTO usuarios ( nick, clave) VALUES ( "pepin", "�;��S�7")

Pero desde la pagina web me inserta el registro pero el campo clave lo deja en blanco.
En cambio si pongo esa consulta en phpmyadmin, la pego y la ejecuto, si inserta perfectametne la consulta.

¿Por que puede ser?

PD: el campo "clave" es un varchar (32)
  #5 (permalink)  
Antiguo 21/08/2009, 15:17
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 19 años, 2 meses
Puntos: 25
Respuesta: Pregunta sobre encriptacion

Intenta asi

$variable_encriptada=AQUI EL COMANDO PARA ENCRIPTAR QUE USAS;

INSERT INTO usuarios ( nick, clave) VALUES ('pepin', '$variable_encriptada') or die(mysql_error());


e intenta poner el tipo de campo en TEXT y no en varchar

Saludos
__________________
Hospedaje Web al mejor costo!
  #6 (permalink)  
Antiguo 21/08/2009, 15:29
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Exclamación Respuesta: Pregunta sobre encriptacion

Cita:
Iniciado por urgido Ver Mensaje
Intenta asi

$variable_encriptada=AQUI EL COMANDO PARA ENCRIPTAR QUE USAS;

INSERT INTO usuarios ( nick, clave) VALUES ('pepin', '$variable_encriptada') or die(mysql_error());


e intenta poner el tipo de campo en TEXT y no en varchar

Saludos
He cambiado el campo a TEXT y sin limite de caracteres.

Uso estos parametros...
$texto = "Esta es la frase oculta";
$key = "millavedeencriptacion";
$alg = "3des"; //tipo de algoritmo
$crypt = 1; //1 encripta y 0 desencripta


Para la llamada de esta funcion...
$clave_encriptada = cryptare($texto, $key, $alg, $crypt);

y la funcion a la que llama es esta...
Código php:
Ver original
  1. <?php
  2. function cryptare($texto, $key, $alg, $crypt)
  3. {
  4.     $encrypted_data="";
  5.     switch($alg)
  6.     {
  7.         case "3des":
  8.             $td = mcrypt_module_open('tripledes', '', 'ecb', '');
  9.             break;
  10.         case "cast-128":
  11.             $td = mcrypt_module_open('cast-128', '', 'ecb', '');
  12.             break; 
  13.         case "gost":
  14.             $td = mcrypt_module_open('gost', '', 'ecb', '');
  15.             break; 
  16.         case "rijndael-128":
  17.             $td = mcrypt_module_open('rijndael-128', '', 'ecb', '');
  18.             break;     
  19.         case "twofish":
  20.             $td = mcrypt_module_open('twofish', '', 'ecb', '');
  21.             break; 
  22.         case "arcfour":
  23.             $td = mcrypt_module_open('arcfour', '', 'ecb', '');
  24.             break;
  25.         case "cast-256":
  26.             $td = mcrypt_module_open('cast-256', '', 'ecb', '');
  27.             break; 
  28.         case "loki97":
  29.             $td = mcrypt_module_open('loki97', '', 'ecb', '');
  30.             break;     
  31.         case "rijndael-192":
  32.             $td = mcrypt_module_open('rijndael-192', '', 'ecb', '');
  33.             break;
  34.         case "saferplus":
  35.             $td = mcrypt_module_open('saferplus', '', 'ecb', '');
  36.             break;
  37.         case "wake":
  38.             $td = mcrypt_module_open('wake', '', 'ecb', '');
  39.             break;
  40.         case "blowfish-compat":
  41.             $td = mcrypt_module_open('blowfish-compat', '', 'ecb', '');
  42.             break;
  43.         case "des":
  44.             $td = mcrypt_module_open('des', '', 'ecb', '');
  45.             break;
  46.         case "rijndael-256":
  47.             $td = mcrypt_module_open('rijndael-256', '', 'ecb', '');
  48.             break;
  49.         case "xtea":
  50.             $td = mcrypt_module_open('xtea', '', 'ecb', '');
  51.             break;
  52.         case "enigma":
  53.             $td = mcrypt_module_open('enigma', '', 'ecb', '');
  54.             break;
  55.         case "rc2":
  56.             $td = mcrypt_module_open('rc2', '', 'ecb', '');
  57.             break; 
  58.         default:
  59.             $td = mcrypt_module_open('blowfish', '', 'ecb', '');
  60.             break;                                         
  61.     }
  62.    
  63.     $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  64.     $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  65.     mcrypt_generic_init($td, $key, $iv);
  66.    
  67.     if($crypt)
  68.     {
  69.         $encrypted_data = mcrypt_generic($td, $texto);
  70.     }
  71.     else
  72.     {
  73.         $encrypted_data = mdecrypt_generic($td, $texto);
  74.         echo($encrypted_data);
  75.     }
  76.    
  77.    
  78.     return $encrypted_data;
  79. }
  80. ?>


Cuando me retorna $encrypted_data hago la consulta...
Código mysql:
Ver original
  1. $consulta = 'INSERT INTO usuarios (
  2.         nick,
  3.         clave)
  4.         VALUES (
  5.         "'.$_POST['registro_nick'].'",
  6.         "'.$clave_encriptada.'"
  7.         )';
  8.         $resultado = mysql_query($consulta,$conexion);     
  9.         $id_usuario= mysql_insert_id();


Pero nada, insertar me inserta el usuario, pero con el campo clave vacio.
  #7 (permalink)  
Antiguo 21/08/2009, 15:55
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 19 años, 2 meses
Puntos: 25
Respuesta: Pregunta sobre encriptacion

agrega esta función a tu form, ejemplo:

enctype="multipart/form-data"

intentalo también con enctype="application/x-www-form-urlencoded" y dime si te funciona. Saludos

NOTA: recuerda que esto se agrega en tu tag <form>

ESTO ES SUPONIENDO QUE EL CAMPO LO PASES POR EL FORM, DE OTRA FORMA PUEDE SER QUE CONVIERTAS A HEX TU STRING Y LO PASES DIRECTO, QUIZÁS POR EL ENCODING NO LO PASA MYSQL.

sALUDOS
__________________
Hospedaje Web al mejor costo!
  #8 (permalink)  
Antiguo 21/08/2009, 15:59
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Respuesta: Pregunta sobre encriptacion

Cita:
Iniciado por urgido Ver Mensaje
agrega esta función a tu form, ejemplo:

enctype="multipart/form-data"

intentalo también con enctype="application/x-www-form-urlencoded" y dime si te funciona. Saludos

NOTA: recuerda que esto se agrega en tu tag <form>

Al final creo que lo estoy conseguido pero con mucho lio, a ver si esto es normal y necesario o algo me pasa, os explico...

Si encripto la clave con algun algoritmo de mcrypt me genera una clave cifrada como �;��S�7

Este tipo de clave con interrogaciones y caracteres raros NO PUEDO grabarlos en la base de datos, porque el registro lo inserta, pero el campo "clave" queda vacio, como si no hubiera introducido ninguna clave.

Entonces hago lo siguiente:
1º Encripto la clave con algun algoritmo.
2º La clave dada (�;��S�7) la codifico en base64...... base64_encode($clave_encriptada)....... y me genera esta nueva clave que si me deja insertar en la BD (+RM7pbVT7zc=)
3º Hago la consulta INSERT para insertar el registro a la BD.
4º Hago la consulta para recuperar la clave de usuario y me la da en el formato base64 (+RM7pbVT7zc=)
5º Decodifico esa clave para volverla a su estado original cifrado...... clave_original=base64_decode($clave);....... y me devuelve �;��S�7
6º Mando la clave_original a la funcion para que desencripte esa clave con el key y el algoritmo correspondiente y aparece la clave real (juan123� )

¿Es normal que tenga que encriptar, codificar en base64, grabar a la BD, decodificar en base64, desencriptar?
A parte, que me tocara quitar con algun comando esa � que me sale al final.
Es decir...¿por que a la hora de manejar la clave en mysql tiene que estar en base64 y no me deja usarla directamente?
¿Hay que hacer tanto lio?


PD: el formulario lo tenia en enctype="multipart/form-data"..... si lo cambio a enctype="application/x-www-form-urlencoded" crees que me evitare tener que codificar en base64???????????????
  #9 (permalink)  
Antiguo 21/08/2009, 16:03
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 19 años, 2 meses
Puntos: 25
Respuesta: Pregunta sobre encriptacion

pues si, si e smucho lio es lo que te comento arriba es debido a los tipos de datos que se manejan binarios, hexadecimales, blablabla... entonces mysql muchas veces no permite la inserción de códigos de cierto tamaño, peso ó grado de codificación...

Referente a lo de form, pues seria bueno que lo probaras y nos cuentes que tal.

Saludos
__________________
Hospedaje Web al mejor costo!
  #10 (permalink)  
Antiguo 21/08/2009, 16:13
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Respuesta: Pregunta sobre encriptacion

mmmh nada... si pongo el formulario como enctype="application/x-www-form-urlencoded" tampoco me lo inserta en la base de datos.

¿Habra algun comando MYSQL que permita grabar la clave cifrada �;��S�7 a la base de datos?

¿Sera seguro pasarlo a base64 y meterlo a la base de datos?
Si convierto una clave cifrada a base64... no habra mas posibilidades de que esta se repita?
Por ejemplo que la clave "pepe" y la clave "manolo" cifrados no coincidan, pero que al pasar sus claves cifradas a base64 si coincidan en esa transformacion? o eso es practicamente imposible?
  #11 (permalink)  
Antiguo 21/08/2009, 16:18
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Pregunta sobre encriptacion

Bueno estoy un poco tarde contestando, pero te indico que md5 y sha1 no son faciles de descriptar. En primer lugar tu puedes crear tu propia forma de encriptar.

Voy por partes.

1. Contestando la parte de faciles de descriptar = Para poder hacerlo tiene que la persona hacer miles y miles (creo que hasta 100 millones) de posibles combinaciones para poder descriptar tu codigo (que sigo diciendo no creo que sea posible, por el siguiente punto)

2. Puedes invertar una forma de encriptar un password haciendo unos trucos. Me refiero a que puedes usar md5 invertir los caracteres, luego vuelves a encriptar si quieres con sha1 añades una letra vuelves a encriptar con md5 y vas a ver que la persona no va a poder encriptar lo que has hecho.

Vez porque no es facil descriptar md5 y sha1 solo tienes que usar astucia a la hora de ingresar la información.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 21/08/2009, 16:48
 
Fecha de Ingreso: diciembre-2008
Mensajes: 118
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Pregunta sobre encriptacion

Doy fe a lo que dice abimael,
Cita:
no es facil descriptar md5 y sha1 solo tienes que usar astucia a la hora de ingresar la información.
  #13 (permalink)  
Antiguo 22/08/2009, 04:01
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Respuesta: Pregunta sobre encriptacion

Si consigo hacer lo siguiente, de momento dejare este tipo de encriptacion, me gusta la idea de poder encriptar/desencriptar.

Pero a la hora de recuperar las claves, deberia eliminar las ����� para mostrar la clave limpia al usuario. Pero claro, si el usuario, en su clave introduce caracteres especiales del tipo
ªº\|@#~€¬!"·$%&/()=?¿^*¨Ç[]{}¡'+`ç´-_.:,;<>
la siguiente funcion que tengo no me sirve ya que quitaria de la cadena todo aquello que no sean ni numeros, ni letras...

echo('Tu clave es: '.preg_replace("/[^A-z ÁÉÍÓÚÑáéíóúñ0-9]/i","",cryptare($texto, $key, $alg, $crypt)));

¿Como seria la expresion regular para que limpiara todos los caracteres extraños (�) y dejara solo numeros, letras y esos caracteres especiales?
  #14 (permalink)  
Antiguo 22/08/2009, 06:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Pregunta sobre encriptacion

Puedes usar
Código php:
Ver original
  1. preg_match("/^[a-zA-Z0-9]+$/",$string,$m);
  2. print_r($m);

Te sugiero leer más sobre expresiones regulares y así te puedas desenvolver
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #15 (permalink)  
Antiguo 22/08/2009, 07:55
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
De acuerdo Respuesta: Pregunta sobre encriptacion

Al final e terminado por hacer lo siguiente...

En el registro de usuario e validado con javascript una expresion regular para que solo introduzca numeros,letras y guiones - _ (quitando la ñÑ que tampoco me interesa que la introduzcan)
( utilizo JQuery validate, pero no se como añadir una regla con expresiones regulares a este plugin, asi que me e montado una funcion a parte con una expresion regular, un poco chapucero teniendo jquery validate pero bueno, asi es como se hubiera hecho sin tener este plugin asi que es lo que hay xD )

A la hora de sacar la clave hago esto...
echo('Tu clave es: '.preg_replace("/[^a-zA0-9-Z_-]/i","",cryptare($texto, $key, $alg, $crypt)));
Que sustituira cualquier otro caracter que no sean letras, numeros - _ por un valor vacio.

Asi ya podre ofrecer la clave limpia de caracteres raros y podre encriptarla y desencriptarla sin preocupacion sobre �interrogaciones� ni peligros de sustituir por "" un caracter valido, que era el mayor miedo que tenia.
  #16 (permalink)  
Antiguo 22/08/2009, 08:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Pregunta sobre encriptacion

Ok si vas a permitir usar el guion en vez de usarlo asi, usa entonces \w

preg_replace("/[^\w\-]/i","",cryptare($texto, $key, $alg, $crypt))
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #17 (permalink)  
Antiguo 22/08/2009, 09:03
Avatar de juanolo  
Fecha de Ingreso: abril-2008
Mensajes: 251
Antigüedad: 16 años
Puntos: 5
Respuesta: Pregunta sobre encriptacion

Cita:
Iniciado por abimaelrc Ver Mensaje
Ok si vas a permitir usar el guion en vez de usarlo asi, usa entonces \w

preg_replace("/[^\w\-]/i","",cryptare($texto, $key, $alg, $crypt))
Pero de esa manera... no aceptaria tambien los espacios, la ñ y no se si la coma y el punto? no se si lei por ahi ke \w son todos los caracteres literales.

Un saludo.
  #18 (permalink)  
Antiguo 23/10/2009, 08:15
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Pregunta sobre encriptacion

base64_encode(); base64_decode();


Se ha dicho que md5 no es tan facil de decifrar y que haciendo combinaciones con sha1 y md5 se puede tener una buena seguridad... no me parece que sea tan asi ya que uno tiene 40 caracteres y el otro 32, es muy sencillo darse cuenta y pasar al siguiente decifrado, algun dia tarde o temprano vas a tener la clave

mcrypt es un poco(siendo generoso) lento, es mucho mas dificil de decifrar, pero no esta en todos los servidores y es un problema andar instalando la libreria y demas y ver los distintos tipos de algoritmos si estan o no estan... es un dilema decidir que tipo de seguridad va a implementar uno... por ahora uso mcrypt, pero no me dan ganas de andar instalando librerias por todos lados ni tener un codigo de 120 lineas extra para una encryptacion

Última edición por Fernand0; 23/10/2009 a las 08:24
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:54.