Como utilizar criptografia em Java

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

1
2
3
4
5
6
7
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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.

1
2
3
4
5
6
7
8
9
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.

1
2
3
4
5
6
7
8
9
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.

1
2
3
4
5
6
7
8
9
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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á:

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

comments powered by Disqus