Comece em poucos minutos
Instalação
O pacote MD5 está disponível no NuGet e funciona em projetos compatíveis com netstandard2.0. Instale-o no diretório do projeto e importe o namespace MD5Hash.
dotnet add package MD5Install-Package MD5Depois, adicione using MD5Hash; ao arquivo que usará a biblioteca.
Decisão rápida
Qual método devo usar?
O melhor algoritmo depende do que você quer proteger ou comparar:
HMAC-SHA-256
Validar integridade usando uma chave secreta compartilhada.
Ver GetHMACSHA256 →API de conteúdo
Gerando hashes de conteúdo
Os métodos de extensão aceitam string, byte[], objetos serializáveis e Stream. O resultado é uma string hexadecimal em letras minúsculas.
GetMD5
MD5 para compatibilidade e checksums legados.
Use GetMD5 quando o sistema de destino já exige MD5 ou quando precisa manter compatibilidade com valores existentes. Para um helper sem extensão, use Hash.Content.
using System.IO;
using System.Text;
using MD5Hash;
string fromString = "123".GetMD5();
byte[] bytes = Encoding.UTF8.GetBytes("Hello, World!");
string fromBytes = bytes.GetMD5();
string fromObject = new { Id = 1, Name = "Test" }.GetMD5();
using var stream = File.OpenRead("arquivo.zip");
string fromStream = stream.GetMD5();Strings usam ASCII por padrão em GetMD5(string). Para acentos, emojis ou outros caracteres fora de ASCII, informe EncodingType.UTF8:
string hash = "Olá, mundo! 👋".GetMD5(EncodingType.UTF8);
string helper = Hash.Content("123");GetSHA256
SHA-256 para integridade e fingerprints.
Para novos checksums, SHA-256 é a escolha recomendada. O método produz 64 caracteres hexadecimais:
string checksum = "hello world".GetSHA256();
// b94d27b9934d3e08a52e52d7da7dabfa...Strings e objetos usam UTF-8 por padrão. Para arquivos grandes, passe o stream aberto; a posição atual será consumida durante a leitura.
using FileStream file = File.OpenRead("relatorio.pdf");
string checksum = file.GetSHA256();GetHMACSHA256
Integridade com autenticação por chave secreta.
HMAC-SHA-256 combina o conteúdo com uma chave secreta. É útil quando quem recebe precisa verificar que a mensagem veio de uma parte que conhece a chave. Nunca exponha essa chave no código-fonte.
string secretKey = "a-secret-key";
string signature = "hello world".GetHMACSHA256(secretKey);Para bytes, passe conteúdo e chave como byte[]. Para objetos, a biblioteca serializa o objeto em JSON antes de calcular o HMAC.
byte[] payload = Encoding.UTF8.GetBytes("Hello, World!");
byte[] key = Encoding.UTF8.GetBytes("a-secret-key");
string signature = payload.GetHMACSHA256(key);GetMD5WithSalt
MD5 com salt para compatibilidade histórica.
Este método existe para reproduzir o comportamento legado. Um salt muda o resultado, mas não transforma MD5 em algoritmo adequado para senhas. Para novas senhas, use PasswordHash.
string hash = "hello world".GetMD5WithSalt("randomSalt");
string objectHash = new { Id = 1 }.GetMD5WithSalt("randomSalt");salt + conteúdo; arrays de bytes e streams calculam conteúdo + salt. Essa diferença é intencional para preservar hashes existentes.byte[] data = Encoding.UTF8.GetBytes("Hello, World!");
byte[] salt = Encoding.UTF8.GetBytes("randomSalt");
string hash = data.GetMD5WithSalt(salt);Armazenamento de credenciais
Hash de senhas com PasswordHash
Senhas não devem ser criptografadas para depois serem recuperadas. Gere um hash lento, armazene o valor retornado e, no login, use o método Verify... correspondente. Cada método cria um salt aleatório e devolve uma string autocontida com os parâmetros necessários para verificação.
Comece com HashArgon2 em novos sistemas quando o ambiente suportar Argon2id. Use PBKDF2 para ampla compatibilidade e bcrypt para interoperar com hashes bcrypt existentes.
PBKDF2-HMAC-SHA256
Opção compatível com várias plataformas. O padrão usa 600.000 iterações, salt de 16 bytes e hash de 32 bytes.
string storedHash = PasswordHash.HashPBKDF2("minha senha");
bool valid = PasswordHash.VerifyPBKDF2("minha senha", storedHash);bcrypt
Útil quando a aplicação precisa ser compatível com o formato bcrypt. O fator de trabalho padrão é 12 e fica incorporado ao hash.
string storedHash = PasswordHash.HashBCrypt("minha senha");
bool valid = PasswordHash.VerifyBCrypt("minha senha", storedHash);Argon2id
Recomendado para novos armazenamentos. O padrão usa 3 iterações, 65.536 KiB de memória, paralelismo 2, salt de 16 bytes e hash de 32 bytes.
string storedHash = PasswordHash.HashArgon2("minha senha");
bool valid = PasswordHash.VerifyArgon2("minha senha", storedHash);
// Também é possível informar os parâmetros nomeados.
string tunedHash = PasswordHash.HashArgon2("minha senha", iterations: 3, memorySize: 65536, degreeOfParallelism: 2);Texto e bytes
Escolhendo o EncodingType
Um hash é calculado sobre bytes. O mesmo texto pode produzir resultados diferentes com encodings diferentes. Use o enum quando precisar reproduzir o formato de outro sistema.
| Valor | Encoding .NET | Quando considerar |
|---|---|---|
UTF8 | UTF-8 | Escolha recomendada para texto novo. |
ASCII | ASCII | Compatibilidade com conteúdo estritamente ASCII. |
UTF7 | UTF-7 | Somente para integrações legadas. |
UTF32 | UTF-32 | Quando o destino exigir o formato. |
Unicode | UTF-16 little-endian | Compatibilidade com aplicações UTF-16. |
BigEndianUnicode | UTF-16 big-endian | Compatibilidade com protocolos específicos. |
Default | Encoding padrão do ambiente | Evite para valores reproduzíveis entre máquinas. |
SHA-256 e HMAC-SHA-256 usam UTF-8 por padrão para strings e objetos. O MD5 legado mantém ASCII no overload de string e UTF-8 no overload de objeto.
Consulta rápida
Referência da API
| Método | Entradas | Uso indicado |
|---|---|---|
Hash.Content | string, encoding opcional | Helper estático para MD5. |
GetMD5 | string, object, byte[], Stream | Compatibilidade e checksum legado. |
GetSHA256 | string, object, byte[], Stream | Integridade de conteúdo. |
GetHMACSHA256 | Conteúdo + chave | Integridade e autenticidade. |
GetMD5WithSalt | Conteúdo + salt | Compatibilidade com MD5 salteado. |
PasswordHash.HashPBKDF2 / VerifyPBKDF2 | Senha + hash armazenado | Senhas com ampla compatibilidade. |
PasswordHash.HashBCrypt / VerifyBCrypt | Senha + hash armazenado | Interoperabilidade com bcrypt. |
PasswordHash.HashArgon2 / VerifyArgon2 | Senha + hash armazenado | Novos sistemas com Argon2id. |
Dúvidas comuns
Perguntas frequentes
MD5 é seguro para senhas?
Não. MD5 é rápido demais e não foi projetado para proteger senhas. Use PasswordHash com Argon2id, PBKDF2 ou bcrypt.
SHA-256 substitui HMAC-SHA-256?
Não exatamente. SHA-256 gera um checksum público. HMAC-SHA-256 usa uma chave secreta e também permite verificar a autenticidade de uma mensagem.
Posso salvar o resultado do hash de senha diretamente no banco?
Sim. Salve a string completa retornada por HashPBKDF2, HashBCrypt ou HashArgon2; ela já contém o algoritmo e os parâmetros necessários para o método Verify....
O que acontece se eu passar uma senha incorreta?
Os métodos Verify... retornam false. Uma senha nula gera ArgumentNullException, então valide a entrada da sua aplicação conforme a regra de negócio.