Criptografia em Java: criptografia e hash – guia prático

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Criptografia em Java: criptografia e hash – guia completo



Criptografia é a base fundamental da segurança de aplicações modernas. Java possui uma infraestrutura poderosa e flexível para trabalhar com criptografia e hash — Java Cryptography Architecture (JCA) e Java Cryptography Extension (JCE). Essas bibliotecas permitem implementar tanto criptografia simétrica (AES) quanto assimétrica (RSA), além de hash criptográfico (SHA-256). Neste artigo, abordaremos os conceitos-chave e escreveremos exemplos funcionais em Java puro (sem dependências externas).



Conceitos básicos e arquitetura JCA/JCE

JCA fornece uma estrutura para trabalhar com operações criptográficas. A ideia central são os provedores (providers), que implementam algoritmos específicos. Por padrão, o JDK inclui o provedor SUN (para hashes) e SunJCE (para criptografia). As principais classes estão nos pacotes javax.crypto e java.security.

  • Cipher — classe principal para criptografia e descriptografia.
  • KeyGenerator — geração de chaves simétricas.
  • KeyPairGenerator — geração de pares de chaves para criptografia assimétrica.
  • MessageDigest — cálculo de hashes.
  • SecretKeySpec — representação de uma chave simétrica a partir de um array de bytes.


Criptografia simétrica: AES

AES (Advanced Encryption Standard) é o algoritmo simétrico mais popular. Usa a mesma chave para criptografar e descriptografar. O modo recomendado é GCM (criptografia autenticada) ou CBC com PKCS5Padding. Abaixo, um exemplo de criptografia de string usando AES-256/GCM.



import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.GCMParameterSpec;import java.security.SecureRandom;import java.util.Base64;

public class AESGCMExample { private static final int AES_KEY_SIZE = 256; private static final int GCM_IV_LENGTH = 12; private static final int GCM_TAG_LENGTH = 128;

public static SecretKey generateKey() throws Exception { KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(AES_KEY_SIZE, SecureRandom.getInstanceStrong()); return keyGen.generateKey(); }

public static String encrypt(String plaintext, SecretKey key) throws Exception { byte[] iv = new byte[GCM_IV_LENGTH]; SecureRandom.getInstanceStrong().nextBytes(iv); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.ENCRYPT_MODE, key, spec); byte[] cipherText = cipher.doFinal(plaintext.getBytes()); byte[] encrypted = new byte[iv.length + cipherText.length]; System.arraycopy(iv, 0, encrypted, 0, iv.length); System.arraycopy(cipherText, 0, encrypted, iv.length, cipherText.length); return Base64.getEncoder().encodeToString(encrypted); }

public static String decrypt(String encryptedData, SecretKey key) throws Exception { byte[] decoded = Base64.getDecoder().decode(encryptedData); byte[] iv = new byte[GCM_IV_LENGTH]; System.arraycopy(decoded, 0, iv, 0, iv.length); byte[] cipherText = new byte[decoded.length - iv.length]; System.arraycopy(decoded, iv.length, cipherText, 0, cipherText.length); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.DECRYPT_MODE, key, spec); return new String(cipher.doFinal(cipherText)); }

public static void main(String[] args) throws Exception { SecretKey key = generateKey()

Recommendations