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: criptografia e hash com o módulo crypto



A segurança dos dados é um dos aspectos-chave do desenvolvimento web moderno. No Node.js, o módulo embutido crypto fornece ferramentas poderosas para proteção criptográfica: desde hash de senhas até criptografia assimétrica. Neste artigo, vamos detalhar as principais funções do módulo crypto, aprender a criptografar e descriptografar dados, e também armazenar senhas com segurança usando hash.



1. Importando o módulo crypto

O módulo crypto é embutido, portanto não requer a instalação de pacotes adicionais. Ele é importado da forma padrão:

const crypto = require('crypto');


2. Hash de dados

Hash é o processo de transformar dados de comprimento arbitrário em uma string de comprimento fixo. Ao contrário da criptografia, a função hash é irreversível. Os algoritmos mais populares são: SHA-256, SHA-512.



Exemplo: hash de uma string usando SHA-256

const data = 'PythonLib — seu guia para o mundo de TI';const hash = crypto.createHash('sha256').update(data).digest('hex');console.log('Hash SHA-256:', hash);


Exemplo: hash com salt (bcrypt)

Para armazenamento seguro de senhas, recomenda-se usar o algoritmo bcrypt ou scrypt. O Node.js tem suporte embutido para scrypt:

const password = 'mySuperPassword123';const salt = crypto.randomBytes(16).toString('hex');

crypto.scrypt(password, salt, 64, (err, derivedKey) => { if (err) throw err; console.log('Hash da senha:', derivedKey.toString('hex'));});


3. Criptografia simétrica (AES)

A criptografia simétrica usa a mesma chave para criptografar e descriptografar dados. O algoritmo mais comum é o AES (Advanced Encryption Standard).



Criptografando dados com AES-256-CBC

const algorithm = 'aes-256-cbc';const key = crypto.randomBytes(32); // chave de 256 bitsconst iv = crypto.randomBytes(16);  // vetor de inicialização

function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { iv: iv.toString('hex'), encryptedData: encrypted };}

const originalText = 'Dados secretos para PythonLib';const encrypted = encrypt(originalText);console.log('Dados criptografados:', encrypted);


Descriptografando dados

function decrypt(encryptedObj) {  const decipher = crypto.createDecipheriv(    algorithm,    key,    Buffer.from(encryptedObj.iv, 'hex')  );  let decrypted = decipher.update(encryptedObj.encryptedData, 'hex', 'utf8');  decrypted += decipher.final('utf8');  return decrypted;}

const decryptedText = decrypt(encrypted);console.log('Texto descriptografado:', decryptedText);


4. Criptografia assimétrica (RSA)

A criptografia assimétrica usa um par de chaves: pública (public) e privada (private). A chave pública é usada para criptografar dados, e a privada para descriptografar. Esta é a base do HTTPS e das assinaturas digitais.



Geração de um par de chaves RSA

const { generateKeyPairSync } = require('crypto');

const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }});

console.log('Chave pública:', publicKey);console.log('Chave privada:', privateKey);


Criptografia e descriptografia com RSA

const secretMessage = 'Olá, PythonLib!';

// Criptografia com chave públicaconst encryptedData = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(secretMessage));console.log('Criptografado');

Recommendations