Criptografia em TypeScript: criptografia e hash de dados
No desenvolvimento web moderno, a segurança dos dados é um aspecto criticamente importante. TypeScript, como uma extensão estritamente tipada sobre JavaScript, fornece ferramentas poderosas para implementar operações criptográficas. Neste artigo, abordaremos os principais algoritmos de criptografia e hash disponíveis em TypeScript e mostraremos como aplicá-los na prática.
Módulo nativo crypto e bibliotecas
Node.js fornece o módulo nativo crypto, que é totalmente compatível com TypeScript. Para aplicações de navegador, utiliza-se a Web Crypto API. Para tarefas mais complexas, recomenda-se a biblioteca crypto-js, que funciona tanto em Node.js quanto no navegador.
Instalação dos pacotes necessários:
npm install crypto-jsnpm install @types/crypto-js --save-devCriptografia simétrica AES
O algoritmo AES (Advanced Encryption Standard) é a cifra simétrica mais popular. Ele usa a mesma chave para criptografar e descriptografar dados.
Exemplo de implementação AES-256 em TypeScript:
import CryptoJS from 'crypto-js';
const SECRET_KEY = 'my-strong-secret-key-32chars';
function encryptAES(text: string): string { const encrypted = CryptoJS.AES.encrypt(text, SECRET_KEY); return encrypted.toString();}
function decryptAES(ciphertext: string): string { const decrypted = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY); return decrypted.toString(CryptoJS.enc.Utf8);}
// Usoconst originalText = 'Dados secretos para proteção';const encrypted = encryptAES(originalText);console.log('Criptografado:', encrypted);
const decrypted = decryptAES(encrypted);console.log('Descriptografado:', decrypted);Criptografia assimétrica RSA
RSA usa um par de chaves: pública (public) e privada (private). A chave pública criptografa os dados, e a chave privada os descriptografa. Isso é ideal para transmissão segura de dados.
Exemplo usando Node.js crypto:
import * as crypto from 'crypto';
function generateRSAKeys(): { publicKey: string; privateKey: string } { const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' } }); return { publicKey, privateKey };}
function encryptRSA(plainText: string, publicKey: string): string { const buffer = Buffer.from(plainText, 'utf-8'); const encrypted = crypto.publicEncrypt(publicKey, buffer); return encrypted.toString('base64');}
function decryptRSA(cipherText: string, privateKey: string): string { const buffer = Buffer.from(cipherText, 'base64'); const decrypted = crypto.privateDecrypt(privateKey, buffer); return decrypted.toString('utf-8');}
// Exemplo de usoconst keys = generateRSAKeys();const message = 'Mensagem confidencial';const encryptedRSA = encryptRSA(message, keys.publicKey);const decryptedRSA = decryptRSA(encryptedRSA, keys.privateKey);
console.log('Original:', message);console.log('Descriptografado:', decryptedRSA);Hash de dados
Hash é uma transformação unidirecional de dados em uma string de comprimento fixo. Ao contrário da criptografia, o hash não pode ser revertido. Principais aplicações:
- Armazenamento de senhas — em vez da senha, armazena-se seu hash
- Verificação de integridade de dados — comparação de hashes de arquivos
- Assinaturas digitais — confirmação de autoria
SHA-256
O algoritmo mais comum da família SHA-2:
import CryptoJS from 'crypto-js';
function hashSHA256(data: string): string { return CryptoJS.SHA256(data).toString();}