In Java, Programação

Como utilizar criptografia em Java

Posted October 3rd, 2008 by Rodrigo Lazoti.

Java fornece uma api Java Cryptography Architecture para trabalhar com criptografia de dados e através dessa api conseguimos criptografar dados em vários tipos de algoritmos como MD5 e SHA. Com isso, vou aplicar os recursos dessa api em uma aplicação Java.

Neste exemplo irei demonstrar como utilizar os algoritmos MD5, SHA-256 e SHA-512 e caso queira saber mais, nos endereços a seguir você poderá entender melhor como esses algoritmos funcionam.

Referência para algoritmo SHA.
Referência para algoritmo MD5.

O exemplo que irei criar está representado no driagrama UML a seguir:

Agora vamos ao código, irei começar criando a interface Cryptography.java

import java.security.NoSuchAlgorithmException;

public interface Cryptography {

String encrypt(String value) throws NoSuchAlgorithmException;

}

Agora vou criar uma classe abstrata que conterá o básico para efetuar uma criptografia, contudo esta classe não será responsável por determinal qual tipo de algoritmo será utilizado.

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

public abstract class CryptographyGeneric {

private MessageDigest messageDigest;
private BASE64Encoder encoder;

protected void useAlgorithm(String algorithm) throws NoSuchAlgorithmException {
if (messageDigest == null || messageDigest.getAlgorithm() != algorithm) {
messageDigest = MessageDigest.getInstance(algorithm);
}

if (encoder == null) {
encoder = new BASE64Encoder();
}
}

protected String encryptByAlgorithm(String algorithm, String value)
throws NoSuchAlgorithmException {

if (value == null) {
throw new IllegalArgumentException("The value is null.");
}

useAlgorithm(algorithm);
byte[] hash = messageDigest.digest(value.getBytes());
return encoder.encode(hash);
}
}

Agora irei criar as classes que especificam qual tipo de algoritmo irá ser utilizado.
Primeiro vou criar a classe para o algoritmo MD5.

import java.security.NoSuchAlgorithmException;

public class CryptographyMD5 extends CryptographyGeneric implements Cryptography {

public String encrypt(String value) throws NoSuchAlgorithmException {
return encryptByAlgorithm("MD5", value);
}

}

Para o algoritmo SHA-256.

import java.security.NoSuchAlgorithmException;

public class CryptographySHA256 extends CryptographyGeneric implements Cryptography {

public String encrypt(String value) throws NoSuchAlgorithmException {
return encryptByAlgorithm("SHA-256", value);
}

}

E finalmente para o algoritmo SHA-512.

import java.security.NoSuchAlgorithmException;

public class CryptographySHA512 extends CryptographyGeneric implements Cryptography {

public String encrypt(String value) throws NoSuchAlgorithmException {
return encryptByAlgorithm("SHA-512", value);
}

}

Pronto, já temos nossas classes. Com isso podemos utilizar varios tipos de algoritmos em um mesmo objeto do tipo Cryptography.

Vamos realizar alguns testes:

public static void main(String[] args) throws NoSuchAlgorithmException {

Cryptography cryptography;

//Criptografia usando MD5
cryptography = new CryptographyMD5();
System.out.println("MD5: " + cryptography.encrypt("Java Cryptography Architecture"));

//Criptografia usando SHA-256
cryptography = new CryptographySHA256();
System.out.println("SHA-256: " + cryptography.encrypt("Java Cryptography Architecture"));

//Criptografia usando SHA-512
cryptography = new CryptographySHA512();
System.out.println("SHA-512: " + cryptography.encrypt("Java Cryptography Architecture"));
}

O resultado desse teste será:

MD5: cJL5LHVk/rjt0HYpNoi/1g==
SHA-256: OtvmRxbTc7fp3SnfSKTgXVi81Gvp7+QPl1B4aCvLU48=
SHA-512: YSsyP2VOGxlwcX873AxlVGqTX4DsJE6XOBTQkjjX4M2zhrMChnohHIejLe1W7RRrfvfMMODiMBou
LqOXHXknig==

Related Posts

  1. Autenticação com Jboss Seam
  2. Herança de propriedades entre entidades com JPA
  3. Dicas para Struts 1.x

14 responses to Como utilizar criptografia em Java

  1. Ivo says:

    Só uma correção, MD5, SHA e outras variantes não criptografias e sim funções de hash. Criptografia é o ato de embaralhar algo tornando-o ilegivel mas com possibilidade de descritografia, tornando-o novamente legivel.
    Estas função geram um hash impossivel de se retornar aos valores de entrada.

  2. Rodrigo Lazoti says:

    Ivo, está correto dizer que MD5 e SHA são funções hash que não podem ser descriptografadas, mas estas também são conhecidas como funções de hash criptográfico ou message disgest, ou seja, são funções criptograficas.

    []‘s

  3. Diego Carrion says:

    Um tempo atras fiz um artigo sobre como trablhar com RSA e Bouncy Castle, pode servir de complemento:

    http://www.mouseoverstudio.com/blog/2008/04/12/comunicacao-web-criptografada-e-segura-com-bouncy-castle-e-rsa/

  4. Sandra Cardoso says:

    Rodrigo, estou estudando criptografia para um projeto da faculdade, seu artigo foi esclarecedor. Eu preciso “baixar” esta API de criptografia para usar esta função? Estou aprendendo Java ainda, estou a pesquisar, desculpe se a pergunta não for pertinente. Obrigada, saudações!

  5. Rodrigo Lazoti says:

    Sandra, esta API ja vem no JDK. Então basta utilizá-la. ;)

    []‘s

  6. Romulo says:

    Rodrigo,
    estou implementando uma rede P2P em um projeto da faculdade, fazendo com que um cliente seja um servidor ao mesmo tempo para compartilhamento de arquivos. Preciso criptografar um arquivo antes do envio, em que momento da minha aplicação poderei utilizar o MD5 aqui proposto por você????

    Obrigado pela atenção.

  7. Sandra says:

    Rodrigo, é possível com o Java, usando o Netbeans 6.0 desenvolver um aplicativo capaz de criptografar e descritografar documentos?

    obrigada!!!

  8. Rodrigo Lazoti says:

    Romulo,

    A criptografia do tipo hash, nao pode ser desdeita depois de aplicaca, por isso este tipo nao seja o mais indicado para o seu objetivo. O ideal seria voce utilizar algum algoritmo como RSA ou outro.

  9. Rodrigo Lazoti says:

    Sandra, é possivel sim.
    Como voce pretende criptografar e depois descriptografar, recomendo voce utilizar um algoritmo como RSA ou outro que nao seja do tipo hash.

  10. fabio nunes says:

    E com oseria a descriptografia ?

  11. Rodrigo Lazoti says:

    Ola fabio, tudo bem?

    Criei um novo post explicando como utilizar criptografia/descriptografia em java.
    Para vizualizar o post acesse http://www.rodrigolazoti.com.br/?p=251

    []`s.

  12. Angelina Carvalho says:

    Gostaria k me esclarecessem como posso fazer um aplicação em java com o algoritimo RSA

  13. Rodrigo Poletini says:

    Ola Rodrigo, queria saber se voce tem algum conhecimento em criptografia sobre imagens? .. preciso para fazer meu TCC, e ta dificil achar algo a respeito. Obrigado desde já.

  14. Thiago says:

    Rodrigo, o sha512 gera uma quebra de linha mesmo ?? interfere em algo ao gravar no bd com essa quebra?

Leave a response: