O MD5 (Message-Digest Algorithm 5) é um dos algoritmos de hash de 128 bits mais populares do mundo do desenvolvimento. No ecossistema Delphi, ele é amplamente utilizado para verificar a integridade de arquivos (como downloads), gerar checksums de tabelas e integrar com APIs que exigem assinaturas de segurança.
Neste artigo, você vai aprender duas formas eficientes de gerar o MD5 em Delphi: a abordagem moderna (usando o framework nativo do Delphi) e a abordagem clássica (com Indy, ideal para quem mantém sistemas legados).
⚠️ Um Alerta Importante: MD5 é seguro para senhas?
Antes de irmos para o código, vale um aviso técnico de segurança: Não utilize MD5 para criptografar senhas em novos projetos.
Por ser um algoritmo antigo, ele sofre com vulnerabilidades de "colisão" (onde dados diferentes geram o mesmo hash) e é facilmente quebrado por ataques de força bruta (rainbow tables). Para senhas, dê preferência a algoritmos modernos como SHA-256 ou BCrypt.
Use o MD5 para o seu propósito ideal hoje: verificação de integridade de arquivos e compatibilidade com APIs legadas.
Método 1: A Forma Moderna (Sem Componentes Externos)
Recomendado para Delphi XE8 ou superior.
Nas versões mais recentes do Delphi, a Embarcadero introduziu a unit System.Hash. Com ela, você gera hashes de forma extremamente rápida sem precisar herdar ou instanciar componentes na memória.
Adicione na cláusula uses: System.Hash
🔹 Gerando MD5 de uma String:
function GerarMD5String(const ATexto: string): string;
begin
// O método GetMD5String faz todo o trabalho pesado de forma nativa
Result := THashMD5.GetMD5String(ATexto);
end;
🔹 Gerando MD5 de um Arquivo:
function GerarMD5Arquivo(const ACaminhoArquivo: string): string;
begin
// Gera o hash diretamente do arquivo físico de forma otimizada
Result := THashMD5.GetMD5String(TFile.ReadAllText(ACaminhoArquivo));
{ Nota: Certifique-se de declarar 'System.IOUtils' na uses para usar o TFile }
end;
Método 2: A Forma Clássica (Usando Indy)
Compatível com Delphi 7, Delphi 2010 e versões posteriores.
Se você está trabalhando em um sistema legado ou prefere usar a biblioteca Indy (que já vem integrada ao Delphi), nós utilizamos a classe TIdHashMessageDigest5.
Adicione na cláusula uses: IdHashMessageDigest, IdHash, System.Classes (ou Classes em versões antigas).
🔹 Gerando MD5 de uma String:
function GerarMD5StringIndy(const ATexto: string): string;
var
LIdMD5: TIdHashMessageDigest5;
begin
LIdMD5 := TIdHashMessageDigest5.Create;
try
// Retorna o Hash formatado em Hexadecimal
Result := LIdMD5.HashStringAsHex(ATexto);
finally
LIdMD5.Free; // Sempre libere o objeto para evitar vazamento de memória!
end;
end;
🔹 Gerando MD5 de um Arquivo:
function GerarMD5ArquivoIndy(const ACaminhoArquivo: string): string;
var
LIdMD5: TIdHashMessageDigest5;
LFileStream: TFileStream;
begin
LIdMD5 := TIdHashMessageDigest5.Create;
// Abre o arquivo em modo de leitura compartilhada
LFileStream := TFileStream.Create(ACaminhoArquivo, fmOpenRead or fmShareDenyWrite);
try
Result := LIdMD5.HashStreamAsHex(LFileStream);
finally
LFileStream.Free;
LIdMD5.Free;
end;
end;
⚡ Qual método escolher?
Use a Unit System.Hash sempre que puder. Ela é mantida diretamente pela Embarcadero, não depende do Indy, é mais rápida e reduz o tamanho final do seu executável.
Use o Indy se o seu projeto for muito antigo (como o guerreiro Delphi 7) ou se você já possui uma arquitetura baseada no ecossistema Indy para outras funções.
💬 Participe da discussão!
Como você gerencia a segurança e os hashes dos seus sistemas hoje em dia? Já migrou para a unit System.Hash ou ainda depende do robusto Indy?
Deixe seu comentário abaixo com suas dúvidas ou compartilhe como este código te ajudou no seu projeto!
Nenhum comentário:
Postar um comentário