Criptografia em Java: criptografia e hash
No mundo moderno da segurança da informação, a criptografia desempenha um papel fundamental. O Java fornece ferramentas integradas poderosas para implementar operações criptográficas através da Java Cryptography Architecture (JCA) e da Java Cryptography Extension (JCE). Neste artigo, vamos detalhar os principais mecanismos: criptografia simétrica, criptografia assimétrica e hash, além de fornecer exemplos práticos de código.
Conceitos básicos de criptografia
Antes de passar ao código, é importante entender a diferença entre os principais primitivos criptográficos:
- Criptografia simétrica — usa a mesma chave para criptografar e descriptografar dados. É rápida, mas requer uma transmissão segura da chave.
- Criptografia assimétrica — usa um par de chaves: pública (para criptografar) e privada (para descriptografar). É mais lenta, mas resolve o problema da troca de chaves.
- Hash — transformação irreversível de dados em uma string de comprimento fixo. É usado para verificar integridade e armazenar senhas.
Criptografia simétrica AES em Java
AES (Advanced Encryption Standard) é o algoritmo simétrico mais popular. Em Java, o trabalho com ele é feito através da classe Cipher. Vejamos um exemplo de criptografia e descriptografia de uma string:
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;
public class AesExample { public static void main(String[] args) throws Exception { // Geração da chave AES-128 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); // Mensagem original String originalMessage = "Olá, criptografia!"; System.out.println("Mensagem original: " + originalMessage); // Criptografia Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes("UTF-8")); String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Mensagem criptografada: " + encryptedMessage); // Descriptografia cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage)); String decryptedMessage = new String(decryptedBytes, "UTF-8"); System.out.println("Mensagem descriptografada: " + decryptedMessage); }}No exemplo, é usado o modo ECB (Electronic Codebook) com padding PKCS5Padding. Para produção, recomenda-se usar modos mais seguros, como CBC ou GCM.
Criptografia assimétrica RSA
RSA é o algoritmo assimétrico clássico. Em Java, as classes KeyPairGenerator e Cipher são usadas para trabalhar com ele. É importante lembrar: o RSA só pode criptografar dados até o tamanho da chave (geralmente 2048 bits). Para grandes volumes de dados, o RSA é combinado com criptografia simétrica (esquema híbrido).
import javax.crypto.Cipher;import java.security.*;import java.util.Base64;
public class RsaExample { public static void main(String[] args) throws Exception { // Geração do par de chaves RSA-2048 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String secretMessage = "Dados secretos"; System.out.println("Mensagem original: " + secretMessage); // Criptografia com chave pública
``` Também na biblioteca
Event Bus e padrão Observer em C++: implementação em C++ moderno
Trabalhando com CSV em C++: bibliotecas e exemplos de código
Geração de QR Codes em PHP: biblioteca phpqrcode e guia completo
ORM para Rust: comparação e exemplos de uso de Diesel, SeaORM e SQLx