# Delphi: Como Gerar Hash MD5 de Strings e Arquivos (Guia Atualizado)

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