Gerando Hash SHA-256 de Arquivos Grandes no Node.js com Streams e Crypto

Gerando Hash SHA-256 de Arquivos Grandes no Node.js com Streams e Crypto

Calcular o hash de arquivos volumosos carregando todo o seu conteúdo na memória RAM pode ocasionar erros de estouro de memória (out of memory) e derrubar a aplicação. O uso do módulo nativo crypto em conjunto com stream.pipeline resolve esse problema ao processar o arquivo em pequenos blocos (chunks), permitindo gerar checksums SHA-256 de forma extremamente performática e segura.

JavaScript

const fs = require('fs');
const crypto = require('crypto');
const { pipeline } = require('stream/promises');

/**
 * Calcula o hash SHA-256 de um arquivo usando streams para economizar memória RAM.
 * @param {string} caminhoArquivo - Caminho do arquivo a ser processado.
 * @returns {Promise<string>} O hash SHA-256 codificado em formato hexadecimal.
 */
async function gerarHashSHA256(caminhoArquivo) {
  // Instancia o hash de criptografia para o algoritmo sha256
  const hashStream = crypto.createHash('sha256');
  // Cria a stream de leitura para o arquivo de origem
  const readStream = fs.createReadStream(caminhoArquivo);

  // Conecta a leitura do arquivo ao fluxo de cálculo do hash
  await pipeline(readStream, hashStream);

  // Retorna a representação hexadecimal do hash gerado
  return hashStream.digest('hex');
}

// --- Exemplo Prático de Uso ---
(async () => {
  const caminhoArquivo = './instalador_grande.iso';

  // Cria um arquivo temporário de teste para a simulação
  fs.writeFileSync(caminhoArquivo, 'Conteúdo de teste para validação de integridade.');

  try {
    console.log('Calculando hash SHA-256 do arquivo...');
    const checksum = await gerarHashSHA256(caminhoArquivo);
    console.log(`[Sucesso] SHA-256: ${checksum}`);
  } catch (erro) {
    console.error('Erro ao calcular o hash do arquivo:', erro.message);
  }
})();

Pontos-chave

  • Consumo Fixo de Memória RAM: A abordagem baseada em streams processa o arquivo em partes (habitualmente de 64 KB), garantindo que arquivos de vários gigabytes utilizem poucos megabytes de memória.
  • Segurança e Integridade: O algoritmo SHA-256 produz um resumo criptográfico único de 64 caracteres hexadecimais, ideal para verificar a integridade de uploads, downloads e arquivos no disco.
  • Pipeline Assíncrono com Tratamento de Recursos: O uso de pipeline do módulo stream/promises encerra e libera automaticamente os descritores de arquivo abertos em caso de falha de leitura.
  • Saída Personalizável (digest): O método .digest('hex') define a codificação final do texto gerado; alternativas comuns incluem 'base64' ou 'binary', dependendo do protocolo de validação desejado.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *