Foros del Web » Programando para Internet » PHP »

Encriptar con semilla?

Estas en el tema de Encriptar con semilla? en el foro de PHP en Foros del Web. Buenas, Estoy haciendo la pantalla de ¿Olvidaste tu contraseña? el usuario mete su dirección de correo y le llega un enlace para que restablezca su ...
  #1 (permalink)  
Antiguo 18/12/2010, 04:21
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Encriptar con semilla?

Buenas,

Estoy haciendo la pantalla de ¿Olvidaste tu contraseña? el usuario mete su dirección de correo y le llega un enlace para que restablezca su contraseña, al pulsarlo le lleva a la web y le pregunta que escriba dos veces su nueva contraseña.

Me gustaría hacer que el enlace que le lleva solo le durase 24 horas y fuese seguro, con seguro me refiero, si otro usuario le roba el enlace que no pudiera generar una nueva contraseña.

Habia pensado en poner en el enlace el tiempo de expiración del enlace, y el user_id del usuario, ej. en texto plano sería

web.com/recuperar_pass?user_id=1351&time=1292667603

Pero me gustaría encriptar esa parte para que no se viese tan claro lo que se está haciendo, pero que fuese un encriptación reversible, pero no tan sencilla como base64 x ej. sino que tuviese algun tipo de semilla.

Qué me aconsejáis y cómo podría hacerlo?

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 18/12/2010, 04:34
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: Encriptar con semilla?

Hola:

No sé si te servirá el que uso en mi sistema de comentarios: Ponga comentarios en su web, en la parte que pone "Activación por e-mail".

En el caso, reservo en la tabla de comentarios un campo para la tabla, otro para indicar que ha sido activado, etc.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 18/12/2010, 08:52
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Encriptar con semilla?

Cita:
Iniciado por caricatos Ver Mensaje
Hola:

No sé si te servirá el que uso en mi sistema de comentarios: Ponga comentarios en su web, en la parte que pone "Activación por e-mail".

En el caso, reservo en la tabla de comentarios un campo para la tabla, otro para indicar que ha sido activado, etc.

Saludos
No acabo de ver en tu ejemplo como encriptar la cadena con alguna semilla

user_id=1351&time=1292667603

Y que luego sea capaz de desencriptarla...

Alguien sabría decirme?

Muchas gracias
  #4 (permalink)  
Antiguo 18/12/2010, 09:55
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Encriptar con semilla?

Encontré una solución, pero le veo un inconveniente, y es que la longitud de la cadena va creciendo si quiero agregar nuevos campos

Código PHP:
Ver original
  1. function encrypt($string, $key) {
  2.    $result = '';
  3.    for($i=0; $i<strlen($string); $i++) {
  4.       $char = substr($string, $i, 1);
  5.       $keychar = substr($key, ($i % strlen($key))-1, 1);
  6.       $char = chr(ord($char)+ord($keychar));
  7.       $result.=$char;
  8.    }
  9.    return base64_encode($result);
  10. }
  11.  
  12. function decrypt($string, $key) {
  13.    $result = '';
  14.    $string = base64_decode($string);
  15.    for($i=0; $i<strlen($string); $i++) {
  16.       $char = substr($string, $i, 1);
  17.       $keychar = substr($key, ($i % strlen($key))-1, 1);
  18.       $char = chr(ord($char)-ord($keychar));
  19.       $result.=$char;
  20.    }
  21.    return $result;
  22. }
  23.  
  24. $cadena_encriptada = encrypt("user_id=234&time=".time(),"secret");
  25. echo $cadena_encriptada;
  26. echo "<br/>";echo "<br/>";
  27. $cadena_desencriptada = decrypt($cadena_encriptada,"secret");
  28. echo $cadena_desencriptada;

Se os ocurre alguna forma de acortar la encriptación?
Ej. esto es lo que me sale encriptado también con la IP del usuario

z8CY4NO5oW5UR7nc4ddxVpOznaOSg2SlqHamoWBSd6qiomJVj6 s=

Es bestialmente grande xD

Pero si la corto una vez generada no podré desencriptarla luego.

Muchas gracias de antemano
  #5 (permalink)  
Antiguo 18/12/2010, 12:18
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 19 años
Puntos: 890
Respuesta: Encriptar con semilla?

Pero no entiendo si el usuario pierde el enlace no tienes forma de hacer nada(como vas a saber si es el usuario verdadero o el ursurpador)

Ahora si se lo pasas por 24 horas de validez, por que no mandarlo con md5(md5(time())) y a su vez guardas la fecha en que se lo enviaste.

usuario
key
date
pass

al momento de mandarle el enlace tendrias que mandarle su id de usuario(o el nombre) y el codigo encriptado.

http://www.*.com/pass_recovery.php?u...ae0196003e30ac

cuando requiera el acceso buscas la id y la coincidencia del key y comparas la fecha actual con la que gusrdaste y envisate la url al usuario. Si la fecha esta entre el rango accede y si no mala suerte.

Fácil. No se por que tanto lio. Lo unico visible va a ser la id del usuario, pero como repito de que sirve tanta seguridad si pierde la url....
__________________
Drupal Argentina

Última edición por NUCKLEAR; 18/12/2010 a las 12:25
  #6 (permalink)  
Antiguo 18/12/2010, 13:01
 
Fecha de Ingreso: enero-2010
Ubicación: Madrid
Mensajes: 18
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Encriptar con semilla?

Y porque no creas un campo en la tabla usuarios que se llame "keyexpire" y otra "key" que al solicitar una nueva clave genere una clave y la meta en key, a su vez meta la fecha en la que expira.

Al entrar el usuario en la url del tipo recuperarclave.php?key=xxxxxxx busca al usuario donde su "key" es xxxxxxxxx y comprueba el campo "keyexpire"
  #7 (permalink)  
Antiguo 19/12/2010, 04:37
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Encriptar con semilla?

La manera que lo estoy haciendo es más segura, porque cojo la IP que tenia el usuario cuando solicitó la contraseña y debe ser la misma que el que accede a través del vinculo jeje!

Sabéis como puedo encriptar una cadena de texto, de una forma reversible pero que ocupe menos de lo que ocupa la cadena de texto original.

Cadena de texto
6bCWlqaZmueilKSepqqal6mdqpnOoKOXq6GVkaKTpZnIoLqmqq apq6mmx7e1k8OWx9mr2sepw8PGst+ow+XOuQ==

Me gustaría que no tuviese más de 30 caracteres!

He probado con base64_enconde pero se vuelve aun más larga...

¿Alguna idea?

Muchas gracias
  #8 (permalink)  
Antiguo 19/12/2010, 04:49
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 19 años
Puntos: 890
Respuesta: Encriptar con semilla?

No entiendo por que te empeñas en agregarle complejidad a algo tan simple.
Guarda la ip tambien el base de datos y puedes serializar todos esos datos hora, ip, hash - en la url envias el uid mas el hash

Para que quieres enviar todos los datos a la vez. Solo con que sea valido el hash puedes hacer las demas comparaciones.

Saludos.
__________________
Drupal Argentina
  #9 (permalink)  
Antiguo 19/12/2010, 04:57
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Encriptar con semilla?

Cita:
Iniciado por NUCKLEAR Ver Mensaje
No entiendo por que te empeñas en agregarle complejidad a algo tan simple.
Guarda la ip tambien el base de datos y puedes serializar todos esos datos hora, ip, hash - en la url envias el uid mas el hash

Para que quieres enviar todos los datos a la vez. Solo con que sea valido el hash puedes hacer las demas comparaciones.

Saludos.
Muchas gracias por tu ayuda NUCKLEAR

Intento ver lo que propones pero no lo consigo :_(

Cómo serializas los datos dentro de la base de datos?
Qué campos nuevos necesitas en la bd para cumplir con eso? solo el hash?

Muchas gracias
  #10 (permalink)  
Antiguo 19/12/2010, 05:29
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 19 años
Puntos: 890
Respuesta: Encriptar con semilla?

Quizas te sirva :
Código PHP:
Ver original
  1. <?php
  2.  
  3. define('KEY', 'passphrase');
  4.  
  5. function encripta($text)
  6. {
  7.     return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, KEY, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
  8. }
  9.  
  10. function desencripta($text)
  11. {
  12.     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, KEY, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
  13. }
  14.  
  15. echo encripta("192.168.1.1 mensaje oculto fecha");
  16. echo "<br />";
  17. echo desencripta("nQfWYpsaqRF3CaP4NrjBbVx6KyItQgw5NPAHKiPVb/8=");
  18.  
  19.  
  20. ?>

Serialize

Saludos.
__________________
Drupal Argentina

Última edición por NUCKLEAR; 19/12/2010 a las 05:35 Razón: Corregir error
  #11 (permalink)  
Antiguo 19/12/2010, 08:12
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: Encriptar con semilla?

Cita:
Iniciado por NUCKLEAR Ver Mensaje
Quizas te sirva :
Código PHP:
Ver original
  1. <?php
  2.  
  3. define('KEY', 'passphrase');
  4.  
  5. function encripta($text)
  6. {
  7.     return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, KEY, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
  8. }
  9.  
  10. function desencripta($text)
  11. {
  12.     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, KEY, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
  13. }
  14.  
  15. echo encripta("192.168.1.1 mensaje oculto fecha");
  16. echo "<br />";
  17. echo desencripta("nQfWYpsaqRF3CaP4NrjBbVx6KyItQgw5NPAHKiPVb/8=");
  18.  
  19.  
  20. ?>

Serialize

Saludos.
Qué diferencia hay entre encriptarlo como pones en tu ejemplo y hacerlo cómo ya utilizo?

Código PHP:
Ver original
  1. function encrypt($string, $key) {
  2.    $result = '';
  3.    for($i=0; $i<strlen($string); $i++) {
  4.       $char = substr($string, $i, 5);
  5.       $keychar = substr($key, ($i % strlen($key))-1, 1);
  6.       $char = chr(ord($char)+ord($keychar));
  7.       $result.=$char;
  8.    }
  9.    return base64_encode($result);
  10. }
  11.  
  12. function decrypt($string, $key) {
  13.    $result = '';
  14.    $string = base64_decode($string);
  15.    for($i=0; $i<strlen($string); $i++) {
  16.       $char = substr($string, $i, 5);
  17.       $keychar = substr($key, ($i % strlen($key))-1, 1);
  18.       $char = chr(ord($char)-ord($keychar));
  19.       $result.=$char;
  20.    }
  21.    return $result;
  22. }

Qué campos nuevos necesitas en la bd para cumplir con eso? solo el hash?

Muchas gracias

Etiquetas: encriptar
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 09:16.