Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Artigo Java Magazine 22 - Começando com Criptografia
Artigo publicado pela Java Magazine edição 22.
Você não gostou da qualidade deste conteúdo?
(opcional) Você gostaria de comentar o que não lhe agradou?

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML.
A vida, o Universo e Tudo mais
Começando com Criptografia
Confidencialidade e Autenticidade de Informações
Conheça algoritmos e use APIs de criptografia e certificação digital na suas aplicações Java
Bruno Souza
Segurança é um item prioritário na maioria dos projetos, com firewalls e HTTPS figurando em quase todos os diagramas de arquitetura de rede desenhados. Mas é o típico conceito amplo que nunca deveria ser mencionado sem qualificação. Usar HTTPS é segurança, assim como é o verificador de bytecodes de Java, mas são tipos e objetivos tão distintos de segurança que fica difícil encaixá-los no mesmo item de projeto.
Dado que grande parte dos projetos em Java hoje são de ambiente web, é normal que a principal preocupação seja nos protocolos seguros para acesso à aplicação. O uso de HTTPS ("secure http", ou http via SSL) em aplicações web é em geral responsabilidade do servidor de aplicações, sendo basicamente transparente para o desenvolvedor. Da mesma forma, é transparente a proteção fornecida por um firewall.
E quando o projeto tem outros requisitos de segurança que precisam ser tratados pelo desenvolvedor? Se você está desenvolvendo uma aplicação desktop ou um servidor específico, ou se há requisitos de assinaturas digitais e certificação do cliente, quais bibliotecas Java você pode usar para garantir a segurança?
Esse artigo trata das tecnologias Java para lidar com certificados digitais, assinaturas eletrônicas e criptografia de mensagens. Como motivação, vamos analisar como essas tecnologias podem ser usadas para tirar proveito de uma legislação brasileira relativamente recente – que talvez seja a solução que você procurava para seu próximo projeto.
Nota: Gostaria de agradecer aos meus amigos no Serpro, em especial ao José Maurílio Dias e Evaldo Gomes, que estão usando o e-CPF
e-CPF: assinatura real em documentos digitais
Com a promulgação da medida provisória 2.200-2, em vigor desde 2001, documentos eletrônicos passaram a ser equivalentes aos documentos em papel, possibilitando sua tramitação. Dessa forma, documentos eletrônicos são agora legalmente equivalentes e isonômicos aos documentos
A certificação é baseada no CPF Eletrônico (e-CPF) e no CNPJ Eletrônico (e-CNPJ), que podem ser requeridos por qualquer cidadão ou empresa no país. Ambos são certificados digitais, que podem ser protegidos por hardware (com smartcards) e permitem a qualquer cidadão confirmar legalmente sua identidade em transações eletrônicas. Em um projeto em andamento, o e-CPF está sendo usado para permitir que o usuário “assine” os documentos enviados ao governo, sendo reconhecido legalmente como se fosse sua assinatura propriamente dita.
Não seria interessante que seus usuários fossem autenticados em seus sistemas, não por uma senha num formulário web, mas por seu certificado nacional? E se esse certificado fosse armazenado em um smartcard, quem sabe até no cartão do telefone celular que eles carregam? Utilizando o e-CNPJ, aplicações podem trocar documentos eletrônicos oficiais entre empresas; e com o e-CPF clientes podem assinar contratos sem sair de casa ou recorrer a um cartório para reconhecimento de firma. Com a validade técnica e jurídica garantida por certificados digitais, é possível realizar transações que exigem assinaturas físicas, como firmar contratos de aluguel, empréstimos e procurações, entre outros.
Essas transações podem ser feitas com segurança, mesmo em ambientes não seguros, como quiosques em shoppings e máquinas Windows. Se você só conhecia certificados digitais associados aos servidores web, já pode ver que servem para muito mais: eles são parte importante de sistemas de segurança. Bem-vindo ao mundo da certificação digital!
JCA e JCE: tecnologias Java por trás dos certificados
Para entender os certificados digitais, precisamos conhecer alguns conceitos de criptografia que nos darão a base para desenvolver aplicações seguras. Faremos isso utilizando as bibliotecas Java para a manipulação das primitivas de criptografia e os certificados. Temos a Java Cryptography Architecture (JCA) e a Java Cryptography Extensions (JCE), além de outras bibliotecas importantes, como a que adiciona o suporte a SSL na plataforma Java, Java Secure Socket Extensions (JSSE), e a Java Certification Path API (CertPath), que trata da verificação de certificados.
A JCA fornece apenas a arquitetura básica. Assim como o JDBC oferece uma camada de abstração que permite "plugar" diversos drivers de banco de dados, a JCA traz as interfaces e objetos fundamentais de criptografia. Permite também a utilização de diferentes providers, que farão o trabalho de criptografia propriamente dito. Dessa forma, o desenvolvedor, ou mesmo o administrador da aplicação, tem a opção de escolher as implementações dos algoritmos de criptografia que melhor atenda às suas necessidades de segurança.
Mas é a JCE que contém as implementações dos algoritmos de criptografia propriamente ditos. Cada funcionalidade de criptografia é realizada por algoritmos com cálculos matemáticos sofisticados. A literatura especializada descreve um grande número desses algoritmos, que atendem às mais diversas necessidades de desempenho e segurança.
A arquitetura de providers de Java possibilita que cada fornecedor inclua no seu produto os algoritmos que considerar mais importantes. Nesse artigo utilizamos alguns algoritmos mais comuns, que estão presentes tanto no provider padrão da Sun, o SunJCE, quanto nos incluídos
Assim como não se faz nada apenas com o JDBC, sendo necessário ao menos um driver, é preciso pelo menos uma implementação da JCE para fazer funcionar uma aplicação que utilize criptografia via JCA. Felizmente já faz parte da JVM uma implementação padrão da JCE, e que pode ser trocada ou expandida com a instalação de outros providers. Para demonstrar conceitos de criptografia, vamos utilizar as implementações padrão da JVM.
Nota: Por questões de proibição de exportação de implementações de criptografia do governo dos Estados Unidos, o provider padrão, chamado “SunJCE”, só foi integrado ao JDK a partir da versão 1.4. Em versões anteriores era necessário baixar e instalar o provider da Sun como uma extensão à parte.
Criptografia
A criptografia é um ramo da ciência da computação (e da matemática aplicada) que pretende abordar um problema que nos acompanha historicamente: a troca de mensagens de forma segura. Desde os símbolos secretos utilizados pelos sacerdotes egípcios, à brincadeira da “língua do pê”, ao uso de índios Navajo pelos americanos na Segunda Guerra Mundial para ludibriar os Japoneses, estamos sempre buscando formas de disfarçar ou cifrar nossas mensagens.
Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Bruno Souza
É Consultor da Summa Technologies e Diretor do SouJava. Conhecido como "JavaMan", Bruno é desenvolvedor, evangelista Java e open source e trabalha com comunidades livres.
2 COMENTÁRIOS
Parabéns pelo artigo, mas ficou uma dúvida.
Como deve-se proceder com as chaves geradas para criptografia/cifragem e descriptografia/decifragem?
Pois se eu cifrar e salvar o dado no banco de dados ou transmitir por socket, como posso decifrar? Pois e eu utilizar o algoritmo de geração de chave novamente, terei uma nova chave. Sendo assim, devo salvar a chave no banco ou em algum outro lugar? E como proceder em uma transmissão por socket?
abraço.
Entendeu ?
VAleu !



