domingo, 21 de março de 2010

Compactar arquivos com senha em Java!

Salve pessoal! Hoje vou falar sobre como compactar um arquivo com senha usando Java. Embora isso pareça trivial, é menos comum do que se pensa, pois isso depende da implementação de um algoritmo de criptografia, que no nosso caso, foi usado o algoritmo AES. É importante citar também que as rotinas de criptografia são disponibilizadas por http://www.bouncycastle.org/.

Bom, para fazer nosso trabalho vamos usar uma biblioteca chamada WinZipAES disponibilizada em http://code.google.com/p/winzipaes/ sob a licença da Apache versão 2.0. Desta vez, vamos usar o Eclipse pois vamos fazer um checkout do projeto, que é um projeto Eclipse. Acesse a página indicada acima, clique na aba 'Source' e observe as instruções para fazer o checkout como usuário anônimo através da url http://winzipaes.googlecode.com/svn/trunk/winzipaes/ . Para isso é importante que você tenha instalado no seu Eclipse o plugin para SVN, caso não tenha, veja como instalar aqui (http://www.eclipse.org/subversive/downloads.php).

So, Let's Go Kids!

Abra o Eclipse, eu estou usando o Galileo, mas fiquem a vontade para usar versões anteriores, ou se preferirem podem usar ainda o Netbeans, daí basta instalar o plugin para abrir projetos Eclipse. Abra a Perspectiva Svn, e clique em New -> Repository Location, na janela que abriu adicione a url citada na página do projeto WinZipAES, como na imagem abaixo.

Observe que o campo User, e Password estão vazios, o que indica que faremos acesso como usuário anônimo, e por isso, com permissão apenas de leitura. Clique em Finish,e depois com o botão direito do mouse sobre o repositório que apareceu na aba "SVN Repositories" do Eclipse e faça o checkout.

Troque de Perspectiva, e observe que apareceu agora um projeto chamado "winzipaes". Vá em src, e no pacote de.idyl.crypto.zip haverá duas classes exemplificando como compactar e descompactar arquivos usando senha.

Abra primeiro a classe AesZipFileEncrypter, vá no método "main", lá temos duas linhas de código como na figura abaixo.



Como podem observar na imagem acima, este já é o exemplo e teste da implementação. Na primeira linha do método estamos instanciando um objeto de AesZipFileEncrypter que recebe como parametro de entrada o caminho com o nome para o arquivo zip que terá a senha. Na segunda linha temos a chamada para o método "zipAndEncrypt", que compacta o arquivo e insere a senha passada no outro parametro.

Indo no diretório indicado na instancia do nosso objeto, você encontrará dois arquivos compactados, um com senha, e outro sem a senha. Isso acontece porque a implementação de exemplo contida nesta classe, cria um arquivo zip comum, e compacta-o em outro colocando a senha. Em um caso de uso real, você poderia passar para ser compactado um arquivo zip comum contendo vários outros arquivos, e passá-lo como parametro no lugar o arquivo txt.

Para descompactar, abra a classe AesZipFileDecrypter.java contida no mesmo pacote. O código esta como na figura abaixo.



Para descompactar o exemplo instancia um objeto da classe AesZipFileDecrypter que recebe como parametro o caminho para o nosso arquivo compactado com senha, e chama o metodo "extractEntry" na 3ª linha passando a entrada para o arquivo que se quer descompactar, o File destino deste arquivo, e a senha.


The Real Life!

Bom, daí vocês me perguntam, "Eu tenho o fonte, e como usar na minha aplicação?". Simples, por questão de segurança, comentem os métodos "main" das duas classes de exemplo, criem um .jar, e adicionem no classpath do seu projeto, seja ele em NetBeans, Eclipse, ou outra IDE qualquer. Ah! Aconselho criar dois métodos estáticos, um compactando, e outro descompactando, em alguma classe utilitária da sua aplicação.

Para quem se interessar, e quiser aprofundar no assunto, recomendo a leitura dos link's da referência.

Espero que tenham gostado. Grande abraço.

Thank you so much!

Referência:

http://www.bouncycastle.org/
http://www.winzip.com/aes_info.htm
http://www.eclipse.org/subversive/downloads.php

4 comentários:

  1. mto bom, mano...

    principalmente no nosso caso, isso garante a segurança necessária na manipulação de arquivos.

    gde abraço

    ResponderExcluir
  2. Man, you haved saved my life! Thanks a fuckin lot!!

    ResponderExcluir
  3. HAVED!!!!!!!!!!???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    OH MY!!!

    What a ridiculous english!!

    Please buy a dictionary..

    ResponderExcluir
  4. Olá, estou precisando muito usar este código, mas não estou conseguindo, fiz o checkout do svn, gerei o .jar e adicionei ao classpath do meu código, mas na classe AesZipFileEncrypter não tem o método main, isso não importa eu sei, o código pode ter sido alterado? quando tento instanciar o enc ele pede mais parâmetros do que tem no exemplo, alguém pode me dar um help?

    ResponderExcluir