A primeira linha regista os parâmetros exatos usados (algoritmo, leitura, tamanhos de entrada), para que um resultado copiado e colado seja sempre reproduzível.
HMAC, PBKDF2 e HKDF — hashing com chave explicado do zero
Numa frase: um hash puro como o SHA-256 qualquer pessoa o pode calcular, pelo que não prova quem enviou uma mensagem — o HMAC mistura uma chave secreta para que só quem tem a chave consiga produzir (ou verificar) o resumo; o PBKDF2 e o HKDF reutilizam depois essa mesma maquinaria HMAC para transformar segredos em chaves, lentamente para palavras-passe e depressa para material já aleatório.
O que é o HMAC (RFC 2104)
A construção. O HMAC são duas execuções de hash, não uma. A sua chave é preenchida até ao tamanho de bloco da função de hash (64 bytes para MD5/SHA-1/SHA-256, 128 para SHA-384/512); a mensagem é submetida a hash uma vez com a chave em XOR com um preenchimento interno fixo, e esse resumo é submetido a hash de novo com a chave em XOR com um preenchimento externo fixo. Esta dupla sandwich é provadamente segura desde que a função de hash subjacente seja uma função pseudoaleatória decente — e é por isso que o HMAC-MD5 ainda resiste aos ataques de colisão práticos que quebraram o MD5 simples (embora esteja retirado de qualquer forma, veja abaixo).
Chaves. Qualquer comprimento de chave funciona: a mais curta do que o tamanho do bloco é usada tal como está (mas menos de 32 bytes é mal visto), a mais longa é primeiro submetida a hash. A mesma página permite-lhe escrever a chave como texto, hex ou Base64, para que uma chave de produção de 64 caracteres hexadecimais possa ser colada sem que alguém a confunda com uma palavra-passe de texto de 64 caracteres — a leitura fica registada na linha de saída exatamente por essa razão.
Onde se encontra. O campo HS256 do cabeçalho de um JWT é literalmente HMAC-SHA-256 sobre as partes do token codificadas em base64url (o Descodificador JWT deste site calcula exatamente isso quando cola um segredo HS256). As assinaturas de webhooks (Stripe, GitHub), o AWS SigV4, a proteção de registos TLS (versões mais antigas) e o primo do OpenSSH umac-64@openssh.com pertencem todos à mesma família.
Porque não simplesmente hash(mensagem || chave)? Extensão de comprimento: cada hash da família MD5/SHA-1/SHA-2 permite a um atacante que conheça H(segredo || msg) calcular H(segredo || msg || preenchimento || qualquer coisa) sem o segredo. A divisão interna/externa do HMAC elimina essa classe de ataques. É o erro caseiro mais comum em código de assinatura de APIs — e a razão pela qual o HMAC existe.
O que é o PBKDF2 (RFC 8018)
Lento por desenho. Uma palavra-passe tem talvez 40 bits de entropia real; a GPU de um atacante testa milhares de milhões de SHA-256 puros por segundo. O PBKDF2 executa HMAC(palavra-passe, sal) repetidamente — iter vezes — pelo que cada tentativa custa os mesmos iter HMACs para si e para o atacante. A predefinição aqui são 600 000 iterações com HMAC-SHA-256, a linha de base do OWASP Password Storage Cheat Sheet; o cursor vai até dez milhões porque as recomendações de segurança sobem à medida que o hardware acelera.
Sal. Um sal aleatório por palavra-passe significa que utilizadores iguais deixam de produzir hashes iguais, e as tabelas pré-calculadas (tabelas arco-íris) tornam-se inúteis. O sal não é secreto — é armazenado ao lado do hash — só tem de ser único. 16 bytes aleatórios é o normal.
Fraqueza conhecida. O PBKDF2 é difícil para o CPU, mas não para a memória: GPUs e ASICs paralelizam-no muito bem. É por isso que o conselho moderno é scrypt ou Argon2id quando se desenha o armazenamento de hashes de palavras-passe (a página do Gerador de hash de palavras-passe desta família cobre-os), mantendo-se o PBKDF2 como a resposta certa para compatibilidade e definições FIPS-140.
O que é o HKDF (RFC 5869)
Extrair e depois expandir. O HKDF tem dois trabalhos. Extrair: comprime o material de chave de entrada possivelmente irregular (um segredo partilhado Diffie–Hellman, por exemplo) juntamente com um sal num único chave pseudoaleatória curta PRK = HMAC(sal, IKM). Expandir: estica esse PRK até qualquer comprimento até 255 blocos de hash, com cada bloco de saída encadeado ao anterior e marcado pelo campo info. O resultado é que um único segredo pode dar-lhe, com segurança, uma chave de cifragem, uma chave MAC e um IV, todos separados.
Não serve para palavras-passe. O HKDF assume que a sua entrada já tem entropia total — faz um HMAC por cada 32 bytes de saída, pelo que uma palavra-passe humana passa por ele praticamente de imediato, exatamente o que um atacante quer. Passar palavras-passe pelo HKDF em vez do PBKDF2 é um erro de desenho clássico; o campo info serve para rótulos de finalidade ("client traffic key", "server iv"), e não para entropia extra.
Onde se encontra. O TLS 1.3 deriva cada chave que usa a partir do segredo do handshake através do HKDF; o WireGuard, o Signal, o EAP-TLS 1.3 e o JSON Web Encryption (como KDF direto de acordo de chaves) aparecem todos na mesma árvore familiar.
Valores de referência — reproduza-os nesta página
As duas primeiras tabelas são os vetores de teste em que se baseiam o botão Exemplo e o autoteste desta página (chave "key", mensagem « The quick brown fox jumps over the lazy dog »; depois o caso no estilo RFC de uma chave de 16 bytes 0x0b e a mensagem « Hi There »). Todos foram gerados por uma implementação nativa independente e voltaram a ser verificados nesta página.
HMAC de « fox », chave = key | Resumo (hex) |
| HMAC-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| Referências KDF | Parâmetros | Saída (hex, primeiros bytes) |
| PBKDF2-HMAC-SHA-1 | password / salt, c=4096, 32 bytes | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | password / salt, c=4096, 32 bytes | c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a |
| HKDF-SHA-256 (RFC 5869 A.1) | IKM=0x0b×22, sal=00..0c, info=f0..f9, L=42 | 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 |
| HKDF-SHA-256 (RFC 5869 A.2) | IKM=00..4f, sal=60..af, info=b0..ff, L=82 | b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c… |
| HKDF-SHA-256 (RFC 5869 A.3) | IKM=0x0b×22, sal e info vazios, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
Erros comuns
- Confundir HMAC com cifragem. O HMAC prova integridade e origem (dado um segredo partilhado); não esconde nada. Quem não tem a chave continua a ver a mensagem completa.
- Confundir HMAC com uma assinatura. As assinaturas digitais são de chave pública: um assina, qualquer um verifica. O HMAC é simétrico: qualquer verificador também poderia forjar. Para não repúdio precisa de RSA/ECDSA (veja a ferramenta RSA desta família quando estiver publicada), e não de HMAC.
- Diferenças de leitura da chave. Uma cadeia de 64 caracteres hexadecimais colada numa caixa de chave de texto torna-se 64 bytes, e não 32 — e o HMAC muda por completo. Esta página imprime a leitura na linha de saída; quando duas ferramentas discordam, isso é a primeira coisa a comparar.
- Iterações PBKDF2 demasiado baixas. 1000 iterações era razoável em 2000; hoje as placas GPU devoram-nas. Se o seu sistema ainda armazena hashes de 1000 iterações, planeie uma migração de novo hash no login.
- HKDF sobre uma palavra-passe. Um HMAC por bloco de saída significa que uma palavra-passe passa instantaneamente — use PBKDF2 (ou Argon2id) para palavras-passe e HKDF para segredos de alta entropia.
- Reutilizar uma mesma chave derivada para tudo. A correção é gratuita: derive chaves separadas com rótulos
info diferentes. Duas chaves a partir do mesmo IKM com rótulos diferentes são independentes por desenho.
Perguntas frequentes
O HMAC-MD5 está quebrado? Como função de hash resistente a colisões o MD5 está morto, mas a segurança do HMAC-MD5 depende do MD5 como função pseudoaleatória, e não se conhece nenhuma quebra prática. Mesmo assim está retirado — não há razão para o escolher em vez do HMAC-SHA-256, exceto por compatibilidade com um protocolo antigo.
Quão longa deve ser a minha chave HMAC? Pelo menos o tamanho de saída da função de hash (32 bytes para SHA-256) e gerada por um CSPRNG. É permitida uma chave mais curta do que o resumo, mas cada bit abaixo disso reduz diretamente a segurança.
O PBKDF2 com mais iterações torna-se « mais seguro » indefinidamente? Aumenta o custo do atacante de forma linear, mas também o custo do seu próprio login, igualmente de forma linear. O jogo é escolher a contagem mais alta que os seus utilizadores toleram — é isso que os números da OWASP calibram.
Porque é que o HKDF está limitado a 255 × o tamanho do hash? O ciclo de expansão é T(i) = HMAC(PRK, T(i-1) || info || i) com um contador i de um byte — 255 é o maior valor do contador, um limite estrutural rígido da RFC 5869, e não uma escolha de política.
Qual a diferença entre o PBKDF2 desta página e o Gerador de hash de palavras-passe? O mesmo algoritmo, função diferente. Esta página deriva bytes de chave em bruto para usar noutro lugar; a página de hash de palavras-passe produz cadeias de credenciais armazenadas (com sal e parâmetros incorporados) e verifica candidatos colados contra elas.