Cadastre-se Revistas DevMedia Cursos
 

Space de CHRISTIANO RODARTE VALE
Busca Autor


Últimas 20 atualizações de CHRISTIANO RODARTE VALE

Artigo - Criptografia MD5

Criptografia MD5

 

Introdução

Criptografia é o ato de codificar dados em informações aparentemente sem sentido, para que pessoas não consigam ter acesso às informações que foram cifradas. Há vários usos para a criptografia em nosso dia-a-dia: proteger documentos secretos, transmitir informações confidenciais pela Internet ou por uma rede local, etc.

 

A técnica usada em Criptografia envolve pura e simples matemática. O sistema de criptografia usado atualmente é extremamente seguro. Especialistas estimam que para alguém conseguir quebrar uma criptografia usando chaves de 64 bits na base da tentativa e erro, levaria cerca de 100.000 anos usando um PC comum.

 

Mas porque é tão seguro? Simples, uma chave de 2 bits terá 4 combinações possíveis. Uma chave de 4 bits, terá 16 combinações possíveis e assim por diante. Agora, vejamos a grande diferença: uma chave de apenas 8 bits terá 65.356 combinações possíveis e, em uma chave de 32 bits existem mais de 4 bilhões de combinações, que para serem decifradas levariam mais de 2 meses (levando em conta 1000 tentativas por segundo, por parte do computador).

 

Neste artigo veremos como implementar um sistema de criptografia usando MD5. Implementaremos uma classe que criptografa os dados de uma senha usada em uma autenticação (login).

 

MD5

O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, usado por softwares com protocolo ponto-a-ponto (P2P), verificação de integridade e logins. Foi desenvolvido para suceder ao MD4 que tinha alguns problemas de segurança.

 

Por ser um algoritmo unidirecional, um hash MD5 não pode ser transformado novamente na password (ou texto) que lhe deu origem. O método de verificação é, então, feito pela comparação das duas hash (uma da base de dados, e a outra da tentativa de login). O MD5 também é usado para verificar a integridade de um ficheiro através, por exemplo, do programa md5sum, que cria a hash de um ficheiro. Isto pode-se tornar muito útil para downloads de ficheiros grandes, para programas P2P que constroem o ficheiro através de pedaços e estão sujeitos à corrupção de ficheiros.

 

O MD5 é de domínio público para uso em geral. A partir de uma mensagem de um tamanho qualquer, ele gera um valor hash de 128 bits; com este algoritmo, é computacionalmente impraticável descobrir duas mensagens que gerem o mesmo valor, bem como reproduzir uma mensagem a partir do seu digest. O algoritmo MD5 é utilizado como mecanismo de integridade em vários protocolos de padrão Internet (RFC1352, RFC1446, etc.), bem como pelo CERT e CIAC.

 

Se o MD5 não pode ser descriptografado, qual é então sua utilidade?

Message Digests são funções hash que geram código de tamanho fixo, em uma única direção, a partir de dados de tamanho arbitrário. Esses códigos hash são extremamente úteis para segurança de senhas. Como ele não pode ser descriptografado, o código hash precisa ser re-gerado e comparado com a seqüência disponível anteriormente. Se ambos se igualarem, o acesso é liberado.


A API Java implementa dois algoritmos de Message Digest: o MD5 e o SHA-1.

 

A API do Message Digest (java.security.MessageDigest)

Para que se possa gerar textos cripografados, é necessário seguir os seguintes passos.

 

  1 - Obter uma instância do algoritmo a ser usado.

  2 - Passar a informação que se deseja criptografar para o algoritmo.

  3 - Efetuar a criptografia.


Para se obter uma instância de um algoritmo de criptografia Message Digest, utiliza-se o método getInstance() da classe MessageDigest.

 

MessageDigest md = MessageDigest.getInstance(“MD5”);

 

Após a chamada a getInstance(), você possui uma referência a um objeto pronto para criptografar seus dados utilizando o algoritmo especificado. Neste caso o MD5.

 

Finalmente, para gerar a chave criptografada, você chama o método digest().

 

As assinaturas existentes são:

 

1 byte[] digest();
2 byte[] digest(byte[] input);
3 int digest(byte[] buf, int offset, int len) throws DigestException;

 

Construindo uma classe para criptografar dados
Primeiramente vamos criar um método estático para geração do algoritmo de criptografia:

 

private static MessageDigest md = null;

 

    static {

        try {

            md = MessageDigest.getInstance("MD5");

        } catch (NoSuchAlgorithmException ex) {

            ex.printStackTrace();

        }

    }

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
08/01/2007 09:42:00





Artigo - UML para Java

UML para Java

 

Introdução

Tendo em vista os rumores que giram em torno deste novo exame da Sun, SCJA – Sun Certified Java Associates, (que, aliás, eu fiz o exame.) onde o tema é cobrado, e aproveitando a oportunidade de apresentar de maneira simplificada como ilustrar projetos de sistemas orientados a objetos, resolvi escrever este tutorial que explica brevemente as características da Unified Modeling Language(UML), fornecendo a notação convencional que aplicamos para ilustrar este projeto. Embora ela não seja excessivamente complexa, podemos subestimar facilmente o poder das características que ela nos fornece. Para uma apresentação mais completa leia The Unified Modeling Language User Guide (Booch, Rumbaugh, and Jacobson 1999). Assimilando o uso das nomenclaturas e notações padrão, aprendemos a nos comunicar no nível de projetos, tornando-nos mais produtivos.

 

Classes

A figura abaixo aplica algumas características usadas para ilustrar classes:

 

UML_Java_fig01.JPG 

Figura 1: O pacote fireWorks inclui as classes fireWork e  Classification.

 

·         Para indicar a existência de um pacote, coloque o nome dele em um retângulo alinhado à esquerda, com caixa maior, na qual podem conter: classes e interfaces. A figura 1 mostra o pacote com.oozinoz.fireWorks.

·         A UML não exige que o diagrama mostre tudo a respeito do objeto retratado, como todo o conteúdo do pacote ou todos os métodos de uma classe.

·         O nome da classe deve ser mostrado centralizado em um retângulo. (A Figura 1 mostra 2 classes: Classification e  fireWork).

·         As variáveis de instância de juma classe devem ser mostradas em um retângulo abaixo do nome da classe. A classe fireWork possui as varáveis de instância name, price, calssification. Coloque dois-pontos depois do nome da variável e então o tipo da variável.

·         Os métodos de uma classe podem ser mostrados em segundo retângulo, abaixo do nome dela. A classe fireWork possui um construtor, um método com o mesmo nome dela e possui pelo menos mais 3 métodos: flies(), getName(), setClassification().

·         Quando um método receber parâmetros, de forma geral devemos mostrá-los, com o método setClassification().

·         As variáveis nas assinaturas dos métodos de forma geral aparecem da seguinte forma: : . Podemos omitir ou abreviar o nome da variável se seu tipo implica o papel dela.

·         Podemos indicar que um método ou uma variável de instância de uma classe estão protegidos (protected) colocando o sinal sustenido(#) na sua frente. O sinal mais(+) indica que o método ou a variável é do tipo public  e o sinal menos(-) indica que o método ou a variável são do tipo private.

·         Para indicar que uma variável de instância é estática – e tem escopo de classe – deixe-a sublinhada como o método flies().

·         Um retângulo com orelha pode ser usado para desenhar notas. O texto dessa nota pode conter: comentários, restrições, ou código. Uma linha tracejada é usada para anexar as notas a outros elementos do diagrama.

 

Relacionamentos entre classes

 

UML_Java_fig02.JPG 

Figura 2: Um objeto MachineComposite contém objetos Machine ou outros composites.

A classe Customer depende da classe LikeMyStuff sem instanciá-la.

 

·         Coloque o nome da classe ou método em itálico para indicar que a classe ou método são abstratos.

·         Uma ponta de flecha fechada e oca é usada para apontar

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
28/11/2006 09:18:00





Artigo - JfreeChart & iReport – Parte II

JfreeChart & iReport – Parte II

 

Criando o Modelo no iReport

Agora vamos criar um modelo no iReport para receber:

             

1 – Os dados que geraram o gráfico apresentados em forma de listagem;

         2 – A imagem do gráfico;

 

Vamos Criar 3 fields para receber os valores que darão origem ao gráfico. Repare que tem os mesmos nomes da entidade ModeloGraficoItem.

 

jfreechartfig04.JPG

Figura 4 – criação do Fields no iReport.

 

Nesta mesma tela, na aba Parameters vamos criar o parâmetro que irá receber a imagem. Observe que este parâmetro deve ser do tipo java.lang.Object:

 

jfreechartfig05.JPG 

Figura 5 – criação do parâmetro imagem.

 

Para mostrar a imagem do gráfico vamos criar um campo na Banda Sumary com a ferramenta ImageTools que receberá um objeto imagem por parâmetro:

 

jfreechartfig06.JPG 

Figura 6 – Propriedades do campo ImageTools.

 

A montagem final do Modelo ficou assim (salvo com o nome de ModeloGrafico):

 

jfreechartfig071.JPG 

Figura 7 – ModeloGrafico.jrxml.

 

Criando o Servlet

O código a seguir é de um Servlet que tem como única função:

 

·         Receber os valores gerados pela classe ComposicaoDadosItemGrafico;

·         Chamar a classe GeradorGrafico para criar um gráfico a partir dos da dados recebidos;

·         Chamar o ModeloGrafico.jasper exibindo o relatório em formato PDF em uma janela do browser.

 

Para criar a imagem do gráfico vamos usar a classe BufferedImage que será o objeto adicionado ao parâmetro. Como os métodos da classe GeradorGrafico são estáticos a chamada é feita da seguinte forma:

 

BufferedImage imagem = GeradorGrafico.gerarGraficoLinha3D("Titulo", "Mes", "Quantidade", array);

 

A classe HashMap de java.util é usada para passar os parâmetros para o relatório:

 

HashMap parametros = new HashMap();

parametros.put("imagem", imagem);

 

Repare o nome do parâmetro: é o mesmo nome do objeto criado com a ferramenta ImageTools.

 

public class ServletRelatorioGrafico extends HttpServlet {

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
17/11/2006 10:45:00





Artigo - JfreeChart & iReport – Parte I

JfreeChart & iReport – Parte I

 

O que é JFreeChart?

 

Visão Geral

JFreeChart é uma biblioteca livre para a  plataforma Java(tm). Foi desenvolvida para ser utilizada em Aplicações Desktop, Applets, Servlets e JSP.

 

jfreechartfig01.JPG

Figura 1 – Exemplo de gráfico do JFreeChart.

 

Características

Jfreechart pode ser usado para gerar gráficos de Pizza, gráficos de Barra, gráficos de linha (com ou sem efeito 3D), gráficos combinados, dentre diversos outros tipos de gráficos. Exporta dados para o formato PNG ou JPEG, Exporta para qualquer formato usando a implementação de Graphics2D incluindo:

PDF via iText (http://www.lowagie.com/iText/);

SVG via Batik (http://xml.apache.org/batik/);

 

Jfreechart é inteiramente escrito em Java e pode ser utilizado em qualquer implementação da plataforma Java 2 (JDK 1.2.2 ou superior).

 

Obtendo o JfreeChart

JfreeChart pode ser baixado a partir do endereço:

 

http://www.jfree.org/jfreechart/index.html

 

Neste endereço você poderá obter as ultimas informações sobre JfreeChart, exemplos de gráficos, downloads, documentação e até um fórum.

 

Sobre este Tutorial

Neste tutorial, procurarei mostrar como se faz para criar um gráfico a partir de uma fonte de dados e mostrar este gráfico em um relatório gerado no iReport a partir de um Servlet. Usando como exemplo um relatório comparativo de vendas de CDs e DVDs durante um certo período.

 

Não daremos muitas explicações sobre iReport, pois este não é o objetivo deste tutorial. Apresentaremos apenas como montar um modelo no iReport para receber o gráfico gerado.

 

Veremos também que o código necessário para a chamada do relatório é mínimo.

 

Para este tutorial usei o JfreeChart 1.0.1 que é a ultima versão disponível para Download.

 

Servlets

A API de Java Servlets é uma tecnologia muito usada para a criação de Aplicações Web e  JfreeChart é um serviço muito bom para ser usado também por Servlets.

 

Neste tutorial vamos mostrar um Servlet gerando um gráfico e em seguida chamando um relatório criado no iReport mostrando o gráfico gerado.

 

O método doGet(...)

O método doGet(...) é chamado pelo Servlet quando uma requisição é enviada pelo cliente (geralmente através de um browser). Em resposta à requisição o Servlet que iremos criar irá realizar os seguintes passos:

 

  • Obtém uma referencia de OutputStream para retornar uma saída ao cliente;
  • Cria o gráfico;
  • Um content type para a resposta é settado para Application/Pdf para exibir o relatório em formato PDF;
  • Criar o relatório passando para ele os dados que geraram o gráfico e a imagem do gráfico gerada.
  • Fechar o OutputStream.

Adicionando os Jar’s

Os .jar’s do JfreeChart que utilizei são jcommon-1.0.0.jar e jfreechart-1.0.1.jar. Primeiramente vamos adicioná-los ao lib do nosso projeto.

 

jfreechartfig021.JPG

Figura 2 – Adicionando os jar’s do JFreeChart.

 

Os Jar’s do iReport que utilizei são: jasperreports-1.2.0.jar, commonslogging-api-1.0.2.jar, commons-collections-3.1.jar, barbecue-1.1.jar, iReport.jar, commons-beanutils-1.5.jar, itext-1.3.1.jar.

 

jfreechartfig03.JPG

Figura 3 – Adicionando os jar’s do iReport.

 

Gerando os Gráficos

Primeiramente, vamos criar as classes ModeloGraficoItem que armazenará os dados que darão origem ao gráfico e ComposicaoDadosItemGrafico que gerará valores arbitrários que serão exibidos no gráfico:

 

ModeloGraficoItem.java

 

import java.io.Serializable;

import java.util.ArrayList;

 

public class ModeloGraficoItem implements Serializable {

 

    private String mes;

    private String produto;

    private int quantidade;

 

    public ModeloGraficoItem() {

    }

 

    public ModeloGraficoItem(String mes, String produto, int quantidade) {

        this.mes = mes;

        this.produto = produto;

        this.quantidade = quantidade;

    }

 

    public String getMes() {

        return mes;

    }

 

    public void setMes(String mes) {

        this.mes = mes;

    }

 

    public String getProduto() {

        return produto;

    }

 

    public void setProduto(String produto) {

        this.produto = produto;

    }

 

    public int getQuantidade() {

        return quantidade;

    }

 

    public void setQuantidade(int quantidade) {

        this.quantidade = quantidade;

    }

}

 

 

ComposicaoDadosItemGrafico.java

 

import java.util.ArrayList;

 

public class ComposicaoDadosItemGrafico {

 

    protected ArrayList array = new ArrayList();

 

    public ComposicaoDadosItemGrafico() {

        array.add(new ModeloGraficoItem("JANEIRO", "CD", 20));

        array.add(new ModeloGraficoItem("FEVEREIRO", "CD", 30));

   &nb

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
17/11/2006 10:44:00





Artigo - Upload de arquivos usando Commons-FileUpload

Upload de arquivos usando Commons-FileUpload

Introdução
Neste tutorial, mostrarei como se faz para enviar arquivos para um servidor através de uma aplicação Web, utilizando o Commons-FileUpload da Jakarta. Serão mostradas duas maneiras de se fazer isso:

1 – Enviar uma imagem para o servidor guardando-a em um campo BLOB do Banco de Dados;

2 – Enviar uma imagem para o servidor, guardá-la em um diretório e armazenar seu endereço no Banco de Dados;

Visão Geral
A API Commons FileUpload tornou fácil e robusta a capacidade de realizar Uploads através de seus Servlets e aplicações Web.

FileUpload analisa gramaticalmente as requisições HTTP conforme RFC 1867 (http://www.ietf.org/rfc/rfc1867.txt) "Form-based File Upload in HTML". Isto quer dizer que, se uma requisição http for submetida usando um método POST, a partir de um formulário tipo "multipart/form-data", então FileUpload pode analisar gramaticalmente esse pedido, e retornar os resultados de maneira fácil para o método que o chamou.

Download do FileUpload 1.1.1

Commons-FileUpload pode ser baixado a partir do endereço:
http://jakarta.apache.org/commons/fileupload/index.html

Após fazer o download e extrair os arquivos, adicione o commons-fileupload-1.1.1.jar ao seu projeto.

Documentação
Neste tutorial procuraremos dar mais atenção à codificação do que à teoria. Uma documentação completa sobre o Commons-FileUpload pode ser encontrada em:
http://jakarta.apache.org/commons/fileupload/using.html

http://jakarta.apache.org/commons/fileupload/apidocs/index.html

e, também no pacote FileUpload 1.1.1.zip

Definindo um formulário para o envio do arquivo
Como exemplo, vamos fazer o upload de uma imagem para o servidor. Um formulário simples deve ser criado em HTML para levar a imagem até nossa aplicação. Este formulário deve obrigatoriamente ser do tipo “multipart/form-data":

<form id="formImagem" name="formImagem" method="post" action="servletupload" enctype="multipart/form-data">

<input type="hidden" id="tipoForm" name="tipoForm" value="imagem">

<input name="imagem" type="file" accept="image/jpeg; image/gif; image/bmp; image/png" id="imagem" class="dados" maxlength="60" tabindex="1" value="c:/" position:absolute; top:23px; left:12px;  width:500px; ">

<input type="submit" id="upload" name="upload" tabindex="2" position:absolute; top:20px; left:532px; >

 

</form>

 

Criando o Servlet

Agora vamos criar um Servlet para receber esta requisição:

 

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.FileUpload;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUploadException;

 

public class ServletUpload extends HttpServlet{

 

    //Initialize global variables

    public void init() throws ServletException {

    }

 

    //Process the HTTP Post request

    public void doPost(HttpServletRequest request, HttpServletResponse response)

                       throws ServletException, IOException {

        doGet(request, response);

    }

 

//Process the HTTP Get request

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 

            boolean isMultiPart = FileUpload.isMultipartContent(request);

            if (isMultiPart) {

                FileItemFactory factory = new DiskFileItemFactory();

                ServletFileUpload upload = new ServletFileUpload(factory);

                String formulario = "";

                try {

                    List items = upload.parseRequest(request);

                    Iterator iter = items.iterator();

                    while (iter.hasNext()) {

                        FileItem item = (FileItem) iter.next();

                        if (item.getFieldName().equals("tipoForm")) {

                            formulario = item.getString();

                        }

                        if (!item.isFormField()) {

                            if (item.getName().length() > 0) {

                                this.inserirImagem(item);

                            }

                        }

                    }

                }

catch (FileUploadException ex) {

   ex.printStackTrace();

                }

catch (Exception ex) {

   ex.printStackTrace();

                }

            }

    }

   // implementação de demais métodos do Servlet.

}

 

Inserindo e recuperando a Imagem em um Campo Blob

Se você analisou o código do Servlet acima, deve ter notado a chamada ao método inserirImagem(item) que ainda não foi implementado. Pois bem, iremos agora escrever este método que irá inserir a imagem em um campo Blob do banco de dados. Para este exemplo eu usei o MySql.

 

A estrutura e criação da tabela deste exemplo são:

 

TabelaTeste

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
14/11/2006 11:53:00





Artigo - Utilizando a API Commons-email para enviar E-mails

Utilizando a API Commons-email para enviar E-mails

 

Introdução

Recentemente, me deparei com a situação em que precisava enviar e-mails de forma automática a partir de minha aplicação web.

 

A partir daí encontrei, além da já conhecida API JavaMail, uma outra API do projeto Jakarta Apache, o Commons-email.

 

O Commons-email foi desenvolvido como uma camada mais abstraída da API JavaMail (J2EE-API) o que a tornou mais simples e robusta.

 

Através do commons-email, é possível enviar e-mails simples, com textos puros, em formato HTML e também e-mail com anexos conforme mostraremos neste tutorial.

 

Observação: Este tutorial é inteiramente referente à documentação disponível em:

http://jakarta.apache.org/commons/email/userguide.html

 

Obtendo o commons-email

O commons-email pode ser baixado a partir do endereço:

http://jakarta.apache.org/site/downloads/downloads_commons-email.cgi

 

Após descompactar o arquivo commons-email-1.0.zip, o arquivo commons-email-1.0.jar deve ser referenciado na pasta lib da sua aplicação.

 

A API commons-email

 

·   SimpleEmail – Esta classe é usada para enviar e-mails simples.

·   MultiPartEmail - Esta classe é usada emitir mensagens multipart. Isto permite uma mensagem de texto com anexos.

·   HtmlEmail – Esta classe envia emails formatados como HTML.

·   EmailAttachment – Esta classe é usada para se criar os anexos do email.

 

Enviando um e-mail simples

Nosso primeiro exemplo criará uma mensagem simples de e-mail para “John Doe” e a enviará através do seu servidor de e-mail.

 

SimpleEmail email = new SimpleEmail();

email.setHostName("mail.myserver.com"); // o servidor SMTP para envio do e-mail

email.addTo("jdoe@somewhere.org", "John Doe"); //destinatário

email.setFrom("me@apache.org", "Me"); // remetente

email.setSubject("Mensagem de Teste"); // assunto do e-mail

email.setMsg("Teste de Email utilizando commons-email"); //conteudo do e-mail

email.send(); //envia o e-mail

 

A chamada ao setHostName(“mail.myserver.com”) ajusta o endereço do servidor smtp que será usado emitir a mensagem. Se esta opção não for ajustada, a propriedade “mail.host” do sistema será usada.

 

Enviando e-mails com anexo 
Para enviar e-mails com anexos deve-se utilizar a classe MultiPartEmail. Essa classe trabalha da mesma forma que a classe SimpleEmail, exceto pela adição do método attach() que será utilizada para adicionar os anexos ao e-mail. Não há limite para o número de anexos (na verdade o servidor de e-mail utilizado que irá impor o limite de anexos).

 

A maneira mais simples de adicionar um anexo é utilizar a classe EmailAttachment que encapsulará o anexo. 

 

No exemplo abaixo, será criado e adicionado como anexo ao e-mail anteriormente criado, uma figura.

 

// cria o anexo.

EmailAttachment attachment = new EmailAttachment();

attachment.setPath("mypictures/john.jpg"); //caminho da imagem

attachment.setDisposition(EmailAttachment.ATTACHMENT);

attachment.setDescription("Picture of John");

attachment.setName("John");

 

// Cria a mensagem de e-mail.

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
07/11/2006 02:36:00





Artigo - Boas Vindas a Christiano Vale

Boas Vindas a Christiano Vale

 

Christiano Rodarte Vale (christianovale@gmail.com), 26 anos, formado em Ciência da Computação pela UNIFOR-MG, trabalho como Desenvolvedor de Componentes Web em uma empresa (iTrade – Tecnologia de Informação) que desenvolve soluções para o setor de Agro-Negócio (www.itradeti.com.br) .

 

Tenho interesse em todas as áreas relacionadas à informática e um interesse especial pela linguagem JAVA em todas as suas plataformas (JME, JSE, JEE).

Tenho experiência com desenvolvimento de Sistemas Distribuídos, Sistemas Web, e Sistemas Desktop.

 

Pretendo colaborar com o Portal no que diz respeito a publicação de pequenos artigos, tutoriais e também no que for necessário e estiver dentro das possibilidades.

 

Informações adicionais:

 

·        

...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
23/08/2006 16:45:00





 

Christiano Rodarte Vale (christianovale@gmail.com), 26 anos, formado em Ciência da Computação pela UNIFOR-MG, trabalho como Desenvolvedor de Componentes Web em uma empresa (iTrade – Tecnologia de Informação) que desenvolve soluções para o setor de Agro-Negócio (www.itradeti.com.br).
Arquivo de atualizações
 2007
 2006

Estatísticas do Autor:
Número de posts: 7
Características dos posts deste autor:
Conteúdo:
Utilidade:
61 8
 
DevMedia Group - Tel: (21) 3382-5038 - www.devmedia.com.br
Todos os Direitos Reservados a DevMedia Group