Criptografia em Node.js: criptografia e hash com crypto

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Criptografia em Node.js: módulo integrado crypto



No desenvolvimento web moderno, a segurança dos dados é um aspecto crítico. O Node.js fornece um módulo integrado poderoso e flexível chamado crypto, que implementa uma ampla gama de funções criptográficas. Este módulo não requer a instalação de pacotes adicionais e permite resolver tarefas de hash, criptografia simétrica e assimétrica, criação de assinaturas digitais e HMAC (Hash-based Message Authentication Code).



Neste artigo, vamos detalhar os principais recursos do crypto e fornecer exemplos práticos de código.



Principais recursos do módulo crypto



  • Hash — transformação de dados de comprimento arbitrário em uma string de comprimento fixo (SHA-256, SHA-512, MD5).
  • Criptografia simétrica — criptografia e descriptografia com uma única chave secreta (AES-256-CBC, AES-192-GCM).
  • Criptografia assimétrica — criptografia com um par de chaves (pública/privada) baseada em RSA ou ECDH.
  • HMAC — hash com chave secreta para verificar a integridade e autenticidade da mensagem.
  • Assinaturas digitais — criação e verificação de assinaturas para confirmar a autoria.


Importação do módulo



O módulo crypto é integrado ao Node.js, portanto sua importação é feita da maneira padrão:



const crypto = require('crypto');


Exemplo 1: Hash de dados (SHA-256)



Hash é uma função unidirecional, frequentemente usada para armazenar senhas e verificar a integridade de arquivos.



const data = 'PythonLib — portal educacional';

// Criando um hash SHA-256const hash = crypto.createHash('sha256');hash.update(data);const hexHash = hash.digest('hex');

console.log('Dados originais:', data);console.log('Hash SHA-256:', hexHash);// Saída: Hash SHA-256: b5a1... (64 caracteres)


Importante: Para armazenar senhas, não use um hash simples, mas sim uma função com "sal" — por exemplo, crypto.scryptSync() ou pbkdf2Sync().



Exemplo 2: Hash de senha com sal (scrypt)



const password = 'MySecurePassword123';

// Geração de sal aleatórioconst salt = crypto.randomBytes(16).toString('hex');

// Criação do hash com sal (scrypt)const hash = crypto.scryptSync(password, salt, 64).toString('hex');

console.log('Sal:', salt);console.log('Hash da senha:', hash);

// Para verificar, use o mesmo sal e compare os hashesconst isMatch = crypto.scryptSync(password, salt, 64).toString('hex') === hash;console.log('Senha coincide:', isMatch); // true


Exemplo 3: Criptografia simétrica AES-256-CBC



A criptografia simétrica usa uma única chave para criptografar e descriptografar. O algoritmo AES-256-CBC também requer um vetor de inicialização (IV).



// Função de criptografiafunction encrypt(text, key) {    const iv = crypto.randomBytes(16); // Geração do IV    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);    let encrypted = cipher.update(text, 'utf8', 'hex');    encrypted += cipher.final('hex');    return { iv: iv.toString('hex'), encrypted };}

// Função de descriptografiafunction decrypt(encrypted, key, ivHex) { const iv = Buffer.from(ivHex, 'hex'); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}

// Usoconst key = crypto.randomBytes(32); // Chave de 256 bitsconst secretMessage = 'Dados secretos para PythonLib';

const encryptedData = encrypt(secretMessage, key);console.log('Criptografado:', encryptedData.encrypted);console.log('IV:', encryptedData.iv);

const decryptedMessage = decrypt(encryptedDa

Recommendations