Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Cifrar carpetas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue Nov 29, 2007 1:35 pm
Norther
Perlero Frecuente
Perlero Frecuente
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
Cifrar carpetas Responder citando

Como sabéis gpg no soporta la encriptación de carpetas, así que decidí hacerme un par de funciones para ello en Bash, la cosa no cuajaba y decidí hacerlas en Perl.

Las pongo aquí con la esperanza de que me ayudéis a resolver un pequeño problema que indico en los comentarios del código (no sé cómo parar el script en caso de que la clave introducida sea errónea para evitar que borre los archivos), y de paso si alguien se apunta me encantaría ver como haríais vosotros esto mismo en Perl pero con mas estilo Razz

Ahí va:
Perl:
#!/usr/bin/perl

my $error = 1;

my $encript = "$ARGV[0].tar";

if (-d $ARGV[0]) {
        system("tar -cvvf $encript $ARGV[0]") or ($error = 0); # El die aqui no me funcionaba asi que puse una bandera.
        if($error =~ 0) {
                system("gpg -ac --no-options $encript");
                system("rm -r $ARGV[0]");
                system("rm -r $encript");
        } else {
                print "Se ha abortado debido a un error.\n";
        }       
} else {
        print "No es una carpeta!!!\n";
}


Y la función para desencriptar:

Perl:
#!/usr/bin/perl

my $fix = $ARGV[0];

$fix =~ s/\W.+/.tar/g;

if($ARGV[0] =~ /tar/ && $ARGV[0] =~ /asc/) {
        system("gpg --no-options $ARGV[0]") or ($error = 1); # ¿Como puedo detectar aqui si introduce la contraseña mal para parar el código?
        system("tar -xvvf $fix");
        system("rm $fix");
        system("rm $ARGV[0]");
} else {
        print "No es una carpeta encriptada válida.\n";
}


Los scripts básicamente cogen el archivo, lo meten en un tar para poder cifrarlo con gpg, y eliminan tanto el archivo original como los creados durante el proceso a excepción del encriptado para dejar solo este último.

Ya sé que es una chapuza porque básicamente hice Bash en Perl para poder utilizar las expresiones regulares en Perl que se me dan mejor, por eso resultaría interesante que posteaseis alternativas a estos código (pero haciendo el mismo proceso que ellos en esencia).

Muchas gracias Wink
Mensaje Jue Nov 29, 2007 3:25 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Pero... ¿ A quien se le ocurre poner un password en un argv ?
¿ Y si ejecutan history... ?

Creo que vía STDIN es mejor y lee esto:

POSIX::Termios: Ocultando input en 25 líneas

Creo que tengo algo de paranoia, pero eso resuelve la duda Laughing
Mensaje Jue Nov 29, 2007 3:47 pm
Norther
Perlero Frecuente
Perlero Frecuente
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
Responder citando

hum, creo que no entendiste bien lo que hace mi script, el ARGV[0] no es la contraseña sino el archivo, el uso seria:

Código:
$ encryptf <archivo>

$ decryptf <archivo>


Ejemplo:

Código:
norther@norther-desktop:~/Desktop$ mkdir wi
norther@norther-desktop:~/Desktop$ encryptf wi
drwxr-xr-x norther/norther   0 2007-11-29 22:49 wi/
Introduzca frase contraseña:   (la contraseña la controla el GPG no mi script asi que no se muestra ni se queda guardada en history)


Código:
norther@norther-desktop:~/Desktop$ mkdir wi
norther@norther-desktop:~/Desktop$ encryptf wi
drwxr-xr-x norther/norther   0 2007-11-29 22:49 wi/
norther@norther-desktop:~/Desktop$ decryptf wi.tar.asc
gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contraseña
gpg: ATENCIÓN: la integridad del mensaje no está protegida
norther@norther-desktop:~/Desktop$ 


Échale un ojo a mi código y luego a estos ejemplos que seguro que te enteras mejor, me explico muy mal Razz

El problema es que si introduces una contraseña incorrecta, el sistema, gpg se entera y no te deja desencriptar el archivo, pero mi script no se entera y ni se inmuta, continua normalmente, por lo que borra los ficheros originales pensando que ya no son de utilidad, lo que necesito es saber cómo hacer que mi sistema se entere de que GPG se enteró de que la contraseña es incorrecta para salir inmediatamente del script Razz
Mensaje Jue Nov 29, 2007 4:19 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Hay que leer un poco más... que estamos en el foro Intermedio... :-)

system() devuelve el resultado de la operación, pero de una forma peculiar: en los 8 bits más altos.

Te recomiendo que mires el ejemplo que hay en la explicación de system(). En tu caso, sería ver si ($? >> 8) vale 0 -todo bien-, u otra cosa -algún fallo-.

Y claro... eso también quiere decir que hemos leído la página de manual de gpg y sabemos lo que significan los números devueltos.

Ultima edición por explorer el Jue Nov 29, 2007 4:25 pm, editado 1 vez
Mensaje Jue Nov 29, 2007 4:22 pm
Norther
Perlero Frecuente
Perlero Frecuente
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
Responder citando

El GPG si que tuve que leerlo y comprenderlo entero anteriormente, pero reconozco que no había echado un ojo al manual de system :$

Voy a ello, muchas gracias Wink
Mensaje Vie Nov 30, 2007 1:25 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 146
Responder citando

Norhter,
Te paso la dirección de mi blog donde posteé un script que te puede ayudar:
http://www.wikipeando.com/index.php/archives/311

Saludos.
Mensaje Vie Nov 30, 2007 4:34 pm
Norther
Perlero Frecuente
Perlero Frecuente
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
Responder citando

Gracias Situ, voy a echarle un ojo a ver si me da nuevas ideas pero lo que son mis códigos los terminé ayer, la verdad me habría gustado que lo hicieran todo de un modo algo más transparente, pero al menos cumplen su función Razz

Encryptf ()
Perl:
#!/usr/bin/perl

my $error = 1;

my $aux = $ARGV[0];

$aux =~ s/\W//g;

my $encript = "$aux.tar";

if (-d $ARGV[0]) {
        system("tar -cvvf $encript $ARGV[0]") || ($error = 0)
       
        if($error =~ 0) {
                system("gpg -ac --no-options $encript");
               
                if($? != 0) {   
                        system("rm $encript");
                        exit 1;
                }
               
                system("rm -r $ARGV[0]");
                system("rm -r $encript");
               
        } else {
                print "Se ha abortado debido a un error.\n";
        }       
       
} else {
        print "No es una carpeta!!!\n";
}



Decryptf ()
Perl:
#!/usr/bin/perl

my $fix = $ARGV[0];

$fix =~ s/\W.+/.tar/g;

if($ARGV[0] =~ /tar/ && $ARGV[0] =~ /asc/) {
        system("gpg --no-options $ARGV[0]");
       
        if($? != 0) {   
                exit 1;
        }
       
        system("tar -xvvf $fix");
        system("rm $fix");
        system("rm -r $ARGV[0]");
       
} else {
        print "No es una carpeta encriptada válida.\n";
}
Mensaje Mar Dic 04, 2007 3:51 pm
situ
Perlero Frecuente
Perlero Frecuente
Registrado: 09 Abr 2007
Mensajes: 146
Responder citando

Norther,

¿Puedo publicar este script en otro sitio?. te envié un privado. Pero no respondiste...

Saludos
Mensaje Mar Dic 04, 2007 4:41 pm
Norther
Perlero Frecuente
Perlero Frecuente
Registrado: 24 Jul 2007
Mensajes: 117
Ubicación: Asturias
Responder citando

Perdona no suelo mirar los mensajes privados (creo que es el segundo que recibo en el tiempo que llevo en estos foros O_o)

Por mi no hay ningún problema, para eso lo postee aquí Smile De todas formas siempre sería de agradecer que hicieras referencia al autor y web de origen ya que el script esta hecho de cero. (Norther & http://perlenespanol.baboonsoftware.com)
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group