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'); Também na biblioteca
Geração Swagger/OpenAPI para JavaScript (Node.js) — ferramentas e bibliotecas
Cliente Redis para Java: Jedis, Lettuce e Redisson — visão geral e exemplos
NetworkExtension Swift: Guia completo com exemplos práticos
Parsing de HTML em Go: visão geral das bibliotecas e exemplos de código