Criptografia simétrica AES
Criptografe e descriptografe dados confidenciais com AES/CBC/PKCS5Padding usando a API javax.crypto do Java.
Criptografia simétrica AES é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
Criptografia simétrica versus assimétrica
A criptografia simétrica utiliza a mesma chave para criptografar e descriptografar (é rápida e adequada para grandes volumes de dados). A assimétrica utiliza um par de chaves pública e privada (é mais lenta e usada para troca de chaves e assinaturas). AES é a cifra simétrica padrão.
Modos do AES: CBC versus GCM
O AES possui vários modos. AES/CBC/PKCS5Padding é comum, mas não oferece autenticação. AES/GCM/NoPadding fornece criptografia e autenticação (AEAD) — sendo fortemente preferível em código novo.
Gerando uma chave AES
Utilize KeyGenerator para gerar uma chave AES de 256 bits com segurança.
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");Criptografia AES/GCM
O modo GCM exige um vetor de inicialização (IV) exclusivo de 12 bytes para cada criptografia. Gere um novo IV aleatório em cada operação de criptografia — nunca reutilize um IV com a mesma chave.
byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)Descriptografia AES/GCM
Extraia o IV dos dados armazenados, reconstrua a especificação e descriptografe. O GCM verifica automaticamente a autenticidade — dados adulterados lançam AEADBadTagException.
// Assume stored = iv + ciphertext:
byte[] iv = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tamperedArmazenando o IV com o texto cifrado
O IV não é secreto — armazene-o antes do texto cifrado ou junto dele. O destinatário precisa do IV para descriptografar. A chave deve permanecer secreta.
byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv, 0, encryptedData, 0, iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);Derivação de chave a partir de senha (PBKDF2)
Nunca utilize uma senha diretamente como chave AES — sua entropia é baixa demais. Derive uma chave com PBKDF2 usando um salt aleatório e um número alto de iterações.
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");Utilizando o provedor de segurança do Java
O provedor padrão do JDK gerencia o AES. Para obter algoritmos adicionais ou conformidade com FIPS, utilize o provedor Bouncy Castle.
// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");Padrão de criptografia de envelope
Criptografe os dados com uma chave de criptografia de dados (DEK) gerada aleatoriamente. Criptografe a DEK com uma chave de criptografia de chaves (KEK) armazenada em um KMS (AWS KMS, HashiCorp Vault). Isso limita a exposição das chaves.
AES em aplicações Spring
O TextEncryptor do Spring Security ou o módulo Spring Security Crypto fornece criptografia AES de alto nível sem exigir o gerenciamento manual de Cipher ou IV.
TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);Armadilhas comuns
Nunca: reutilize um IV com a mesma chave, utilize o modo ECB (os padrões são preservados), use uma senha diretamente como chave ou ignore a tag de autenticação. Utilize sempre GCM em código novo.
Verificação rápida
O que AES/GCM fornece que AES/CBC não fornece?
Recapitulação
Utilize AES/GCM/NoPadding para obter criptografia autenticada. Gere um novo IV aleatório de 12 bytes para cada criptografia. Acrescente o IV ao texto cifrado. Derive chaves a partir de senhas com PBKDF2. Nunca reutilize um IV com a mesma chave.
Perguntas Frequentes
A aula “Criptografia simétrica AES” é grátis?
Sim — o texto completo de “Criptografia simétrica AES” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Criptografia simétrica AES”?
Criptografe e descriptografe dados confidenciais com AES/CBC/PKCS5Padding usando a API javax.crypto do Java. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Criptografia simétrica AES”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Hash criptográfico com MessageDigest
- Criptografia simétrica AES
- HMAC-SHA256 para integridade de mensagens
- JWT: estrutura, criação e verificação