Comparacao de Algoritmos de Hash: Quando Usar MD5, SHA e Bcrypt?
Compare as caracteristicas e usos de varios algoritmos de hash e fornecemos um guia de selecao para cada situacao.

O Que e uma Funcao Hash?
Uma funcao hash e uma funcao matematica que transforma dados de tamanho arbitrario em um valor de tamanho fixo e unico. Esse valor transformado e chamado de hash, digest ou checksum. Funcoes hash sao componentes fundamentais da seguranca computacional moderna, utilizadas em diversas areas, desde armazenamento de senhas ate blockchain.
Para entender funcoes hash, vamos usar uma analogia. Uma funcao hash e como um moedor que transforma carne em hamburguer. Colocando os mesmos ingredientes, sempre sai o mesmo resultado, mas e impossivel recuperar a forma original da carne a partir do hamburguer. Esta e a caracteristica central das funcoes hash.
Propriedades Essenciais das Funcoes Hash
Uma funcao hash criptografica segura deve ter quatro propriedades essenciais.
1. Deterministica
A mesma entrada sempre gera a mesma saida. Sem essa propriedade, o hash nao poderia ser usado para verificacao de dados.
// Sempre o mesmo resultado
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7" // true
MD5("Hello") === "8b1a9953c4611296a827abf8c47804d7" // true (sempre)
2. Unidirecional (One-way)
Deve ser computacionalmente impossivel recuperar os dados originais a partir do valor hash. Gracas a essa propriedade, o hash pode ser usado com seguranca para armazenar senhas. Mesmo que o banco de dados seja vazado, a senha original nao pode ser descoberta apenas com o valor hash.
3. Resistencia a Colisoes
Quando duas entradas diferentes geram o mesmo valor hash, isso e chamado de colisao. Uma boa funcao hash deve tornar extremamente dificil encontrar colisoes. A razao pela qual MD5 e SHA-1 nao sao mais recomendados para fins de seguranca e justamente porque colisoes foram encontradas.
4. Efeito Avalanche
Se a entrada mudar em apenas 1 bit, a saida deve mudar completamente. Essa propriedade impede inferir padroes no valor hash a partir de entradas similares.
MD5("Hello") = "8b1a9953c4611296a827abf8c47804d7"
MD5("hello") = "5d41402abc4b2a76b9719d911017c592"
// Uma unica letra diferente, resultado completamente diferente
Analise Detalhada dos Principais Algoritmos de Hash
MD5: Por Que Nao Deve Mais Ser Usado para Seguranca?
MD5 e uma funcao hash de 128 bits projetada por Ronald Rivest em 1991. Ja foi a mais amplamente utilizada, mas atualmente nao deve ser usada para fins de seguranca.
Entrada: "Hello World"
Saida: b10a8db164e0754105b7a99be72e3fe5
Tamanho: 128 bits (32 caracteres hex)
A Queda do MD5: Em 2004, a equipe de pesquisa de Wang Xiaoyun na China descobriu colisoes no MD5. Depois, em 2008, colisoes MD5 foram exploradas para gerar certificados SSL falsos. Atualmente, computadores comuns podem gerar colisoes MD5 em segundos.
Quando ainda pode usar MD5:
- Verificacao de integridade de downloads de arquivos (para deteccao de erros, nao seguranca)
- Geracao de chaves de cache
- Checksums nao relacionados a seguranca
SHA-1: O Ataque SHAttered do Google
SHA-1 e uma funcao hash de 160 bits projetada pela NSA e padronizada pelo NIST. Era considerada mais segura que MD5, mas em 2017, Google e CWI Amsterdam demonstraram uma colisao atraves do ataque "SHAttered".
Nesse ataque, os pesquisadores geraram dois arquivos PDF com conteudos diferentes mas com o mesmo valor SHA-1. A quantidade de computacao usada no ataque foi equivalente a 6.500 anos de tempo de CPU e 110 anos de tempo de GPU. Embora tenha exigido recursos massivos, o momento em que uma colisao real foi comprovada marcou o fim da confiabilidade de seguranca do SHA-1.
Status atual: A maioria dos navegadores e autoridades certificadoras rejeita certificados SHA-1.
SHA-256 (SHA-2): O Padrao Atual
A familia SHA-2 e a sucessora do SHA-1, com varias variantes incluindo SHA-224, SHA-256, SHA-384 e SHA-512. Entre elas, SHA-256 e a mais amplamente utilizada.
Entrada: "Hello World"
Saida: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Tamanho: 256 bits (64 caracteres hex)
SHA-256 e Bitcoin: Bitcoin usa SHA-256 como nucleo. Mineradores realizam trilhoes de calculos de hash para encontrar um valor nonce que faca o hash SHA-256 do cabecalho do bloco satisfazer certas condicoes (muitos zeros no inicio). A imprevisibilidade do SHA-256 torna esse processo justo.
Usos:
- Assinaturas digitais (com RSA, ECDSA)
- Certificados SSL/TLS
- Blockchain
- Verificacao de integridade de arquivos
SHA-3: A Nova Abordagem do Keccak
SHA-3 e a funcao hash mais recente padronizada pelo NIST em 2015. Usa uma estrutura completamente diferente (estrutura esponja) do SHA-2, entao mesmo que uma vulnerabilidade seja encontrada no SHA-2, o SHA-3 nao sera afetado.
A filosofia de design do SHA-3 foi "fazer diferente". Enquanto SHA-2 usa a estrutura Merkle-Damgard, o algoritmo Keccak do SHA-3 e baseado em funcoes esponja. E uma especie de seguro - SHA-2 ainda e seguro, mas uma alternativa esta pronta para ataques futuros.
Bcrypt: Hash Especial para Senhas
Bcrypt e projetado para ser intencionalmente lento, diferente de hashes de uso geral. Em hashing de senhas, "lentidao" e uma vantagem. Isso impede que atacantes tentem bilhoes de senhas por segundo.
// Usando fator de custo (cost factor) 12
bcrypt.hash("password", 12)
// Exemplo de saida
$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/X4.VVzfQl0Pfy6.nO
Estrutura do valor hash Bcrypt:
$2b$- Versao do algoritmo12$- Fator de custo (2^12 = 4.096 iteracoes)- Proximos 22 caracteres - Salt (codificado em Base64)
- Restante - Valor hash real
A cada aumento de 1 no fator de custo, o tempo de calculo dobra. O valor recomendado atualmente e 10-12.
Argon2: O Hash de Senha Mais Moderno
Argon2 e o algoritmo vencedor da Password Hashing Competition de 2015. E projetado para ser intensivo em memoria, sendo forte contra ataques paralelos de GPU.
Parametros:
- Memoria: Quanta RAM usar
- Tempo: Quanto tempo calcular
- Paralelismo: Quantas threads usar
A variante Argon2id e recomendada para uso geral. Para novos projetos, use Argon2. Se precisar de compatibilidade legada, use Bcrypt.
Guia de Uso Pratico
Armazenamento de Senhas: Salt e Pepper
Salt: Adiciona um valor aleatorio unico para cada senha. Mesmo senhas iguais geram hashes diferentes, neutralizando ataques de rainbow table.
// Usando Salt
password: "password123"
salt: "x7Gh9kL2" (gerado aleatoriamente)
hash: bcrypt("password123" + "x7Gh9kL2")
Pepper: Enquanto o Salt e armazenado no banco de dados junto com o hash, o Pepper e gerenciado como um segredo separado (variaveis de ambiente, modulos de seguranca de hardware, etc.). Mesmo se o banco de dados for vazado, a senha nao pode ser verificada sem o Pepper.
Verificacao de Integridade de Arquivos
Ao distribuir software, fornecer o checksum SHA-256 junto permite verificar se o arquivo baixado nao foi adulterado.
# Gerar hash do arquivo
sha256sum ubuntu-22.04.iso
# a1b2c3d4e5f6... ubuntu-22.04.iso
# Verificar
echo "a1b2c3d4e5f6... ubuntu-22.04.iso" | sha256sum --check
Guia de Selecao de Algoritmo por Uso
| Uso | Algoritmo Recomendado | Nao Recomendado |
|---|---|---|
| Armazenamento de senhas | Argon2id, Bcrypt, PBKDF2 | MD5, familia SHA (muito rapidos) |
| Integridade de arquivos | SHA-256, SHA-512 | MD5 (colisoes possiveis) |
| Assinaturas digitais | SHA-256 + RSA/ECDSA | SHA-1 (ataque de colisao) |
| Tokens de API | HMAC-SHA256 | - |
| Chaves de cache | MD5, SHA-1 (rapidos) | - |
Exemplos de Codigo
Node.js
const crypto = require('crypto');
const bcrypt = require('bcrypt');
// SHA-256
const sha256 = crypto.createHash('sha256')
.update('Hello World')
.digest('hex');
// Bcrypt
const hash = await bcrypt.hash('password', 12);
const isValid = await bcrypt.compare('password', hash);
Python
import hashlib
import bcrypt
# SHA-256
sha256 = hashlib.sha256(b'Hello World').hexdigest()
# Bcrypt
hashed = bcrypt.hashpw(b'password', bcrypt.gensalt(12))
is_valid = bcrypt.checkpw(b'password', hashed)
Ferramentas Hash do Toolypet
Com as ferramentas hash do Toolypet, voce pode gerar e verificar diversos hashes rapidamente:
- Gerador MD5/SHA: Calcule instantaneamente valores hash de textos ou arquivos
- Ferramenta Bcrypt: Geracao e verificacao de hash de senhas
- Comparacao de Hash: Compare dois valores hash com seguranca (prevencao de ataques de timing)
Realize operacoes de hash necessarias para desenvolvimento e testes facilmente no Toolypet.