Criptografía en TypeScript: cifrado y hashes en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en TypeScript: cifrado y hashes — guía completa



El desarrollo web moderno es impensable sin garantizar la seguridad de los datos. TypeScript, como superconjunto de JavaScript, proporciona herramientas potentes para implementar funciones criptográficas tanto en el lado del cliente como en el servidor (Node.js). En este artículo, analizaremos en detalle los principales primitivos criptográficos: cifrado simétrico y asimétrico, hashing, y también veremos el trabajo con firmas digitales. Todos los ejemplos de código están escritos en TypeScript y listos para usar en proyectos reales.



1. Fundamentos de criptografía en TypeScript



En el ecosistema TypeScript existen dos enfoques principales para la criptografía:

  • Web Crypto API — API integrada de navegadores y Node.js (a partir de la versión 15), que proporciona acceso de bajo nivel a operaciones criptográficas.
  • Bibliotecas de terceros — como crypto-js, node-forge, bcryptjs para tareas específicas.


Para el desarrollo del lado del servidor en Node.js, se recomienda usar el módulo integrado crypto, que es parte de la plataforma y no requiere instalar dependencias adicionales.



2. Hashing de datos



El hashing es una transformación unidireccional de datos de longitud fija. Se utiliza para almacenar contraseñas, verificar la integridad de archivos y crear sumas de verificación.



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('');}

// Ejemplo de usoconst myHash = await hashSHA256('¡Hola, mundo!');console.log(myHash); // 64 caracteres hexadecimales


2.2. Hashing de contraseñas con bcrypt



Para almacenar contraseñas de forma segura, use algoritmos especializados con sal, como bcrypt:



import bcrypt from 'bcryptjs';

async function hashPassword(password: string): Promise<string> { const salt = await bcrypt.genSalt(12); // 12 rondas — buen equilibrio return await bcrypt.hash(password, salt);}

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

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


3. Cifrado simétrico



El cifrado simétrico usa una sola clave para cifrar y descifrar datos. El algoritmo más moderno y seguro es AES-GCM, que proporciona tanto confidencialidad como autenticación.



3.1. Cifrado y descifrado 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 añade 16 bytes de etiqueta de autenticación al 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> { // Combinamos ciphertext y tag para Web Cry

Recommendations