Criptografia em TypeScript: criptografia e hashes na prática

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 TypeScript: criptografia e hashes — guia completo



O desenvolvimento web moderno é impensável sem garantir a segurança dos dados. TypeScript, como uma extensão do JavaScript, fornece ferramentas poderosas para implementar funções criptográficas tanto no lado do cliente quanto no servidor (Node.js). Neste artigo, vamos detalhar os principais primitivos criptográficos: criptografia simétrica e assimétrica, hashing, e também abordaremos o trabalho com assinaturas digitais. Todos os exemplos de código estão escritos em TypeScript e prontos para uso em projetos reais.



1. Fundamentos da criptografia em TypeScript



No ecossistema TypeScript, existem duas abordagens principais para criptografia:

  • Web Crypto API — API nativa de navegadores e Node.js (a partir da versão 15), que fornece acesso de baixo nível a operações criptográficas.
  • Bibliotecas de terceiros — como crypto-js, node-forge, bcryptjs para tarefas específicas.


Para desenvolvimento no servidor com Node.js, recomenda-se usar o módulo nativo crypto, que faz parte da plataforma e não requer instalação de dependências adicionais.



2. Hashing de dados



Hashing é uma transformação unidirecional de dados em um comprimento fixo. É usado para armazenar senhas, verificar a integridade de arquivos e criar somas de verificação.



2.1. SHA-256 usando Web Crypto API



async function hashSHA256(data: string): Promise<string> {  const encoder = new TextEncoder();  const dataBuffer = encoder.encode(data);  const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);  const hashArray = Array.from(new Uint8Array(hashBuffer));  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');}

// Exemplo de usoconst myHash = await hashSHA256('Olá, mundo!');console.log(myHash); // 64 caracteres hexadecimais


2.2. Hashing de senhas com bcrypt



Para armazenamento seguro de senhas, use algoritmos especializados com salt, como bcrypt:



import bcrypt from 'bcryptjs';

async function hashPassword(password: string): Promise<string> { const salt = await bcrypt.genSalt(12); // 12 rodadas — bom equilíbrio return await bcrypt.hash(password, salt);}

async function verifyPassword(password: string, hash: string): Promise<boolean> { return await bcrypt.compare(password, hash);}

// Exemploconst password = 'MinhaSenhaSegura!';const hashedPassword = await hashPassword(password);const isValid = await verifyPassword('MinhaSenhaSegura!', hashedPassword);console.log(isValid); // true


3. Criptografia simétrica



A criptografia simétrica usa uma única chave para criptografar e descriptografar dados. O algoritmo mais moderno e seguro é AES-GCM, que fornece tanto confidencialidade quanto autenticação.



3.1. Criptografia e descriptografia AES-GCM



interface EncryptedData {  iv: Uint8Array;  ciphertext: Uint8Array;  tag: Uint8Array;}

async function encryptAESGCM( plaintext: string, key: CryptoKey): Promise<EncryptedData> { const encoder = new TextEncoder(); const data = encoder.encode(plaintext); const iv = crypto.getRandomValues(new Uint8Array(12)); // IV de 96 bits const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, data ); // GCM adiciona 16 bytes de tag de autenticação no final const ciphertext = new Uint8Array(encrypted.slice(0, encrypted.byteLength - 16)); const tag = new Uint8Array(encrypted.slice(encrypted.byteLength - 16)); return { iv, ciphertext, tag };}

async function decryptAESGCM( encrypted: EncryptedData, key: CryptoKey): Promise<string> { // Combina ciphertext e tag para Web Cry

Recommendations