0Pricing
Java Academy · Aula

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 string

Algoritmos 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 broken

Convertendo 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); // true

Verificando 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-time

Encadeando 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 chars

DigestInputStream 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

  1. Hash criptográfico com MessageDigest
  2. Criptografia simétrica AES
  3. HMAC-SHA256 para integridade de mensagens
  4. JWT: estrutura, criação e verificação
← Voltar para Java Academy