Criptografía en TypeScript: cifrado y hash
El desarrollo web moderno es impensable sin garantizar la seguridad de los datos. TypeScript, como superconjunto estrictamente tipado de JavaScript, proporciona a los desarrolladores herramientas potentes para implementar algoritmos criptográficos. En este artículo, exploraremos los principales métodos de cifrado y hash disponibles en el ecosistema TypeScript y mostraremos cómo aplicarlos en la práctica.
¿Por qué es importante la criptografía en TypeScript?
TypeScript se usa ampliamente tanto para frontend como para backend (a través de Node.js). En ambos casos, surge la necesidad de proteger datos confidenciales: contraseñas de usuarios, tokens de autenticación, contenido de mensajes. Sin una protección criptográfica adecuada, los datos pueden ser interceptados o comprometidos.
La criptografía en TypeScript resuelve tres tareas principales:
- Confidencialidad — cifrado de datos para que no puedan ser leídos por terceros.
- Integridad — garantía de que los datos no han sido alterados durante la transmisión.
- Autenticación — verificación de la autenticidad de la fuente de datos.
Principales bibliotecas criptográficas para TypeScript
En TypeScript se pueden usar tanto las API integradas del navegador como bibliotecas de terceros. Veamos las opciones más populares:
1. Web Crypto API (integrada en el navegador)
API estándar disponible en navegadores modernos y Node.js (desde la versión 15). No requiere instalación de paquetes adicionales. Soporta AES, RSA, SHA y mucho más.
2. crypto (biblioteca de Node.js)
Módulo integrado de Node.js que proporciona un amplio conjunto de funciones criptográficas. Para TypeScript se requiere instalar los tipos: npm install @types/node.
3. bcrypt / bcryptjs
Biblioteca especializada para hash de contraseñas. Recomendada para almacenar contraseñas de usuarios gracias a su protección integrada con sal.
4. tweetnacl / nacl
Biblioteca para cifrado de clave pública (NaCl). Destaca por su alto rendimiento y facilidad de uso.
Cifrado de datos en TypeScript
Veamos dos tipos principales de cifrado: simétrico (una clave) y asimétrico (par de claves).
Cifrado simétrico con AES-GCM
AES (Advanced Encryption Standard) en modo GCM proporciona tanto cifrado como verificación de integridad de datos. Ejemplo de implementación en TypeScript usando Web Crypto API:
// Función de cifrado AES-GCMasync function encryptAESGCM( plaintext: string, password: string): Promise<{ iv: Uint8Array; ciphertext: Uint8Array }> { const encoder = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey'] );
const key = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('my-salt'), iterations: 100000, hash: 'SHA-256', }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt'] );
const iv = crypto.getRandomValues(new Uint8Array(12)); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, encoder.encode(plaintext) );
return { iv, ciphertext: new Uint8Array(encrypted), };}
// Ejemplo de usoconst { iv, ciphertext } = await encryptAESGCM('Mensaje secreto', 'mi-contraseña');console.log('Datos cifrados:', ciphertext);Cifrado asimétrico con RSA-OAEP
RSA utiliza un par de claves: pública para cifrar y privada para descifrar. Ejemplo de generación de claves y cifrado:
// Generación de par de claves RSAasync function generateRSAKeyPair(): Promise<CryptoKeyPair> { return await crypto.subtle.generateKey( { name: También en la biblioteca
Envío de SMS en Go (Golang): integración con API de biblioteca
Chai para JavaScript (Node.js): guía completa con ejemplos
Trabajo con archivos ZIP en Swift (iOS/macOS): guía completa
Autorización y autenticación en Kotlin: JWT, Spring Security y Ktor