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
pipelinedo módulostream/promisesencerra 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.
