Hash criptográfico com MessageDigest
Faça hash de senhas com SHA-256, adicione salt para impedir ataques de tabelas arco-íris e compare os resumos com segurança.
Hash criptográfico com MessageDigest é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 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.
O que é geração de hashes criptográficos?
Uma função de hash criptográfica mapeia dados de qualquer tamanho para um resumo de tamanho fixo. Ela é unidirecional (não pode ser revertida), determinística e resistente a colisões. É utilizada para armazenar senhas, garantir a integridade dos dados e gerar assinaturas digitais.
API MessageDigest
MessageDigest.getInstance("SHA-256") retorna um gerador de hash SHA-256. Chame digest(bytes) para calcular o hash e obter uma matriz de bytes.
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest("password123".getBytes(StandardCharsets.UTF_8));
String hex = HexFormat.of().formatHex(hash);
System.out.println(hex); // 64-char hex stringAlgoritmos comuns
O JDK oferece suporte a: MD5 (comprometido — nunca o utilize para segurança), SHA-1 (obsoleto para segurança), SHA-256 (padrão), SHA-512 (mais forte) e SHA3-256 (moderno). Utilize sempre SHA-256 ou SHA-512 em código novo.
MessageDigest.getInstance("SHA-256"); // recommended
MessageDigest.getInstance("SHA-512"); // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically brokenConvertendo um hash em uma cadeia hexadecimal
O resultado em matriz de bytes precisa ser convertido em uma cadeia hexadecimal para armazenamento ou comparação. Utilize HexFormat (Java 17+) ou String.format em versões mais antigas.
// Java 17+:
String hex = HexFormat.of().formatHex(hash);
// Older Java:
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String hex = sb.toString();O salt: neutralizando tabelas arco-íris
Uma tabela arco-íris associa senhas comuns aos seus hashes. Adicionar um salt a cada senha antes de gerar o hash torna as tabelas arco-íris inúteis. Armazene o salt junto com o hash.
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
byte[] hash = md.digest("password".getBytes(StandardCharsets.UTF_8));
// Store: Base64.encode(salt) + ":" + Base64.encode(hash)Hash de senhas — utilize BCrypt
SHA-256 com salt é melhor do que SHA-256 puro, mas ainda é rápido — um invasor pode tentar bilhões de combinações por segundo. Utilize uma KDF lenta: BCryptPasswordEncoder (Spring Security), PBKDF2 ou Argon2 para senhas.
// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // trueVerificando a integridade de arquivos
Gere o hash de um arquivo para detectar corrupção ou adulteração. Compare o hash calculado com uma referência conhecida como íntegra.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (InputStream is = Files.newInputStream(Path.of("app.jar"))) {
byte[] buf = new byte[8192];
int n;
while ((n = is.read(buf)) > 0) md.update(buf, 0, n);
}
String hash = HexFormat.of().formatHex(md.digest());
System.out.println("SHA-256: " + hash);Comparando hashes com segurança
Utilize MessageDigest.isEqual() para fazer uma comparação em tempo constante e evitar ataques de temporização. Nunca utilize String.equals() para comparar hashes.
byte[] expected = computeHash(storedHash);
byte[] actual = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-timeEncadeando atualizações
Chame md.update(bytes) várias vezes antes de md.digest() para gerar o hash de dados recebidos em partes (leitura em fluxo).
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"Codificando hashes para armazenamento
Armazene hashes binários como Base64 (mais curto do que hexadecimal) ou como cadeias hexadecimais. Base64 utiliza 43 caracteres para SHA-256, contra 64 caracteres em hexadecimal. Ambos estão corretos — seja consistente.
byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex = HexFormat.of().formatHex(hash); // 64 charsDigestInputStream para leitura em fluxo
Encapsule um InputStream com DigestInputStream para calcular o hash durante a leitura — assim, você evita carregar o arquivo inteiro na memória.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), md)) {
dis.transferTo(OutputStream.nullOutputStream());
}
String hash = HexFormat.of().formatHex(md.digest());Verificação rápida
Por que SHA-256 com salt ainda não é recomendado para armazenar senhas?
Recapitulação
Utilize MessageDigest.getInstance("SHA-256") para verificar a integridade dos dados. Sempre adicione salt às senhas — mas utilize BCrypt ou Argon2 para armazená-las, não SHA puro. Utilize uma comparação em tempo constante (MessageDigest.isEqual) para evitar ataques de temporização.
Perguntas Frequentes
A aula “Hash criptográfico com MessageDigest” é grátis?
Sim — o texto completo de “Hash criptográfico com MessageDigest” é 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 “Hash criptográfico com MessageDigest”?
Faça hash de senhas com SHA-256, adicione salt para impedir ataques de tabelas arco-íris e compare os resumos com segurança. 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 1 de 4.
Quanto tempo leva a aula “Hash criptográfico com MessageDigest”?
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