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,bcryptjspara 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 hexadecimales2.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); // true3. 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 También en la biblioteca
Biblioteca GraphQL JavaScript (Node.js): Guía completa de Apollo Server y herramientas
Generación de informes PDF en Java: bibliotecas y ejemplos
Caching en C# (.NET): Redis, MemoryCache y otras soluciones
Gradle Kotlin DSL: guía completa con ejemplos para Kotlin