Biblioteca .NET para hashing

Hashes para C# com uma API simples e direta.

Gere MD5 para compatibilidade, SHA-256 para integridade, HMAC-SHA-256 para autenticidade e hashes de senha modernos em aplicações .NET.

netstandard2.0•MIT License•NuGet
quick-start.cs
using MD5Hash;

string checksum = "hello world".GetSHA256();

Console.WriteLine(checksum);
// b94d27b9934d3e08...
Escolha o algoritmo pelo objetivo

MD5 não é criptografia e não deve ser usado para senhas. Use MD5 apenas quando precisar reproduzir um valor legado ou gerar um checksum compatível. Para novas integrações, prefira SHA-256 ou HMAC-SHA-256; para senhas, use PasswordHash.

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.

.NET CLI
dotnet add package MD5
Package Manager Console
Install-Package MD5

Depois, 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:

Compatibilidade

MD5

Reproduzir hashes de sistemas antigos ou checksums legados.

Ver GetMD5 →
Integridade

SHA-256

Comparar arquivos, payloads e impressões digitais de conteúdo.

Ver GetSHA256 →
Autenticidade

HMAC-SHA-256

Validar integridade usando uma chave secreta compartilhada.

Ver GetHMACSHA256 →
Senhas

PasswordHash

Armazenar e verificar senhas sem guardar o texto original.

Ver PasswordHash →

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.

01

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.

String, bytes, objeto e stream
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");
02

GetSHA256

SHA-256 para integridade e fingerprints.

Para novos checksums, SHA-256 é a escolha recomendada. O método produz 64 caracteres hexadecimais:

Checksum de conteúdo
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();
03

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.

Mensagem e chave
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);
04

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");
Detalhe de compatibilidade: strings e objetos calculam 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.

Recomendaçã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.

Argon2id

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.

Gerar e verificar
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);
Boa prática: armazene a string inteira retornada pela biblioteca e não compare hashes de senha manualmente. Ajuste os parâmetros com medições no hardware de produção.

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.

Valores disponíveis em EncodingType
ValorEncoding .NETQuando considerar
UTF8UTF-8Escolha recomendada para texto novo.
ASCIIASCIICompatibilidade com conteúdo estritamente ASCII.
UTF7UTF-7Somente para integrações legadas.
UTF32UTF-32Quando o destino exigir o formato.
UnicodeUTF-16 little-endianCompatibilidade com aplicações UTF-16.
BigEndianUnicodeUTF-16 big-endianCompatibilidade com protocolos específicos.
DefaultEncoding padrão do ambienteEvite 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étodos públicos disponíveis
MétodoEntradasUso indicado
Hash.Contentstring, encoding opcionalHelper estático para MD5.
GetMD5string, object, byte[], StreamCompatibilidade e checksum legado.
GetSHA256string, object, byte[], StreamIntegridade de conteúdo.
GetHMACSHA256Conteúdo + chaveIntegridade e autenticidade.
GetMD5WithSaltConteúdo + saltCompatibilidade com MD5 salteado.
PasswordHash.HashPBKDF2 / VerifyPBKDF2Senha + hash armazenadoSenhas com ampla compatibilidade.
PasswordHash.HashBCrypt / VerifyBCryptSenha + hash armazenadoInteroperabilidade com bcrypt.
PasswordHash.HashArgon2 / VerifyArgon2Senha + hash armazenadoNovos 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.

Pronto para usar?

Instale o pacote e gere seu primeiro hash.

Consulte o código-fonte, abra uma issue ou instale a versão mais recente pelo NuGet.