Trabalhando com encriptação e assinatura digital
em 25/05/2004
, por Daniel Destro
O comando acima, deve gerar o arquivo do certificado digital no caminho "C:\\guj.jks". Os argumentos passados para o keytool são: -genkey : para indicar que vamos gerar a chave. -alias : é o nome das chaves que serão armazenadas no keystore. No nosso caso é "guj". -keyalg : indica qual o algorítmo que vamos usar. No nosso caso RSA. O padrão é DSA. -keypass : indica a senha de proteção da chave no keystore. -storepass : é a senha de proteção do keystore. -keystore : indica onde as chaves serão armazenadas. Se nada for informado, por padrão (no Windows) é armazenada em user.home/.keystore. -dname : nome da entidade que vai gerar o par de chaves. Exemplo: cn = Nome Comun, ou = Unidade Organizacional (departamento ou divisão), o = Nome da Organização, l = localidade (cidade), s = Estado, c = País. Pronto! Agora já sabemos como criar nosso certificado digital, que possui um par de chaves privada e pública. Caso você necessite extrair a chave pública do seu certificado, para passar a alguém, você precisa do certificado para exportar a chave. Você deve executar o seguinte comando:
-export : informa que você vai exportar a chave. -alias : é o nome dados para a chave. -keystore : onde o certificado foi armazenado. -file : novo arquivo gerado, que é a chave pública exportada no formato X509. Existe uma ferramente visual para se criar e extrair os certificados digitais. Ela se chama KeyTool Explorer e pode ser encontrada em: http://www.lazgosoftware.com/kse/index.html
Na chamada dos métodos informamos: File cert : Arquivo do certificado digital. String alias : alias das chaves no keystore. String password : senha das chaves. Para pegar uma instância do KeyStore, informamos JKS, que é o formato default na geração das chaves. Este é um tipo proprietário da implementação de keystore da Sun.
Os dois métodos são bem simples e nos fornecem maneiras de encriptar os dados, na forma de array de bytes e também fornece uma maneira de verificar o dado assinado.
Criamos um File que representa para nosso arquivo de certificado em disco e em seguida extraimos as chaves privada e pública. Com o método createSignature() nós assinamos a String txt, que é o dado que desejamos encriptar (assinar). Em seguida, imprimimos na tela a representação hexadecimal da assinatura gerada. E, por fim, verificamos a assinatura com o método verifySignature(). O método verifica se o dado em txt é correspondente ao dado assinado (encriptado). O método para converter para a representação hexadecimal é o seguinte:
Conclusão A princípio a assinatura de dados utilizando certificado digital não parece muito simples ou trivial. Mas espero que, com este material, a vida de muitos, que precisam trabalhar com isso, possa se tornar mais fácil. Faça o download do arquivo Java completo deste tutorial. Abraços e até a próxima!
Trabalhando com encriptação e assinatura digital
Hoje em dia, na grande maioria das empresas, uma grande preocupação é questão com a segurança dos dados. Por se tratarem de dados importantíssimos para as companhias e seus clientes, é de fundamental importância garantir que eles estejam seguros e protegidos. Afinal, imagine a sua senha de acesso do Submarino sendo roubada? Seria um grande prejuízo para você e a empresa.
A solução de parte desses problemas de segurança pode ser resolvida com a encriptação dos dados trafegados na rede, por meio de algorítmos de assinatura, com o DSA e RSA, além do uso de certificados digitais.
Os certificados digitais são comumente usados para assinar os JARs dos Applets, para que eles possam ter acesso à máquina do cliente, ou mesmo em sites seguros, que trafegam dados como senhas, cartão de banco e etc. Estes certificados podem ter certificados conhecidos, fornecidos por grandes empresas de segurança, como a Thawte e a VeriSign, porém não há a necessidade, pois geralmente esses certificados são um pouco caros.
Há pouco tempo eu tive um certo esforço para trabalhar com encriptação de dados e assinatura digital, para acessar um web services. Para resolver todo este problema eu utilizei um certificado digital, criado por mim mesmo e código Java para extração das chaves e geração da assinatura dos dados.
Gerando o Certificado Digital
Inicialmente precisamos ter um certificado digital, que será a base para encriptarmos e decriptarmos os dados. Esse certificado vai conter uma chave pública e privada. A privada é usada por você, para encriptar os dados. A chave pública você fornece para quem for decriptar os seus dados.
No meu caso, eu assinava os dados de acesso ao Web service com a minha chave privada. O meu fornecedor do Web Service tinha uma cópia da minha chave pública, para que ele pudesse decriptar os dados que eu envei, e ele pudesse se certificar da minha autenticidade.
O próprio JDK do Java fornece uma ferramente para gerar um certificado digital, o keytool. Não vamos explorar muito em detalhes esta ferramenta, mas vamos sim ver como gerar um simples certificado digital, que é a nossa intenção.
A ferramente keytool recebe alguns argumentos na sua execução, que são as informações do certificado que vamos gerar.
Para gerar o certificado, execute a seguinte linha de comando:
O comando acima, deve gerar o arquivo do certificado digital no caminho "C:\\guj.jks". Os argumentos passados para o keytool são: -genkey : para indicar que vamos gerar a chave. -alias : é o nome das chaves que serão armazenadas no keystore. No nosso caso é "guj". -keyalg : indica qual o algorítmo que vamos usar. No nosso caso RSA. O padrão é DSA. -keypass : indica a senha de proteção da chave no keystore. -storepass : é a senha de proteção do keystore. -keystore : indica onde as chaves serão armazenadas. Se nada for informado, por padrão (no Windows) é armazenada em user.home/.keystore. -dname : nome da entidade que vai gerar o par de chaves. Exemplo: cn = Nome Comun, ou = Unidade Organizacional (departamento ou divisão), o = Nome da Organização, l = localidade (cidade), s = Estado, c = País. Pronto! Agora já sabemos como criar nosso certificado digital, que possui um par de chaves privada e pública. Caso você necessite extrair a chave pública do seu certificado, para passar a alguém, você precisa do certificado para exportar a chave. Você deve executar o seguinte comando:
-export : informa que você vai exportar a chave. -alias : é o nome dados para a chave. -keystore : onde o certificado foi armazenado. -file : novo arquivo gerado, que é a chave pública exportada no formato X509. Existe uma ferramente visual para se criar e extrair os certificados digitais. Ela se chama KeyTool Explorer e pode ser encontrada em: http://www.lazgosoftware.com/kse/index.html
Extraindo as chaves no Java
Agora que temos o certificado, precisamos de uma maneira de extrair essas chaves, dentro do Java, para podermos utilizá-las para encriptação e decriptação dos dados.
O método que simplifica a extração das chaves é o seguinte:
Na chamada dos métodos informamos: File cert : Arquivo do certificado digital. String alias : alias das chaves no keystore. String password : senha das chaves. Para pegar uma instância do KeyStore, informamos JKS, que é o formato default na geração das chaves. Este é um tipo proprietário da implementação de keystore da Sun.
Assinando os dados
Agora que já possuímos as chaves pública e privada, vamos ver como encriptar e decriptar (verificar) os dados.
Os dois métodos são bem simples e nos fornecem maneiras de encriptar os dados, na forma de array de bytes e também fornece uma maneira de verificar o dado assinado.
Testando a assinatura digital
Para finalizar, vamos ver realmente como utilizar toda esta parafernalha.
Criamos um File que representa para nosso arquivo de certificado em disco e em seguida extraimos as chaves privada e pública. Com o método createSignature() nós assinamos a String txt, que é o dado que desejamos encriptar (assinar). Em seguida, imprimimos na tela a representação hexadecimal da assinatura gerada. E, por fim, verificamos a assinatura com o método verifySignature(). O método verifica se o dado em txt é correspondente ao dado assinado (encriptado). O método para converter para a representação hexadecimal é o seguinte:
Conclusão A princípio a assinatura de dados utilizando certificado digital não parece muito simples ou trivial. Mas espero que, com este material, a vida de muitos, que precisam trabalhar com isso, possa se tornar mais fácil. Faça o download do arquivo Java completo deste tutorial. Abraços e até a próxima!