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); // trueExemplo 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 Também na biblioteca
Frameworks CLI para Kotlin: Clikt, kotlinx-cli, picocli — visão geral e comparação
ORM para JavaScript (Node.js): comparação e exemplos
ErrorOr para C# (.NET): guia completo com exemplos práticos