Criptografía en TypeScript: cifrado y hash de datos
En el desarrollo web moderno, la seguridad de los datos es un aspecto crítico. TypeScript, como superestructura fuertemente tipada sobre JavaScript, proporciona potentes herramientas para implementar operaciones criptográficas. En este artículo, exploraremos los principales algoritmos de cifrado y hash disponibles en TypeScript y mostraremos cómo aplicarlos en la práctica.
Módulo incorporado crypto y bibliotecas
Node.js proporciona el módulo incorporado crypto, que es totalmente compatible con TypeScript. Para aplicaciones de navegador se utiliza Web Crypto API. Para tareas más complejas, se recomienda la biblioteca crypto-js, que funciona tanto en Node.js como en el navegador.
Instalación de los paquetes necesarios:
npm install crypto-jsnpm install @types/crypto-js --save-devCifrado simétrico AES
El algoritmo AES (Advanced Encryption Standard) es el cifrado simétrico más popular. Utiliza la misma clave para cifrar y descifrar datos.
Ejemplo de implementación de AES-256 en TypeScript:
import CryptoJS from 'crypto-js';
const SECRET_KEY = 'mi-clave-fuerte-de-32-caracteres';
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 = 'Datos secretos para proteger';const encrypted = encryptAES(originalText);console.log('Cifrado:', encrypted);
const decrypted = decryptAES(encrypted);console.log('Descifrado:', decrypted);Cifrado asimétrico RSA
RSA utiliza un par de claves: pública (public) y privada (private). La clave pública cifra los datos y la privada los descifra. Es ideal para la transmisión segura de datos.
Ejemplo 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');}
// Ejemplo de usoconst keys = generateRSAKeys();const message = 'Mensaje confidencial';const encryptedRSA = encryptRSA(message, keys.publicKey);const decryptedRSA = decryptRSA(encryptedRSA, keys.privateKey);
console.log('Original:', message);console.log('Descifrado:', decryptedRSA);Hash de datos
El hash es una transformación unidireccional de datos en una cadena de longitud fija. A diferencia del cifrado, el hash no se puede revertir. Principales usos:
- Almacenamiento de contraseñas — en lugar de la contraseña se almacena su hash
- Verificación de integridad de datos — comparación de hashes de archivos
- Firmas digitales — confirmación de autoría
SHA-256
El algoritmo más común de la familia SHA-2:
import CryptoJS from 'crypto-js';
function hashSHA256(data: string): string { return CryptoJS.SHA256(data).toString();}
También en la biblioteca
Procesamiento de imágenes en C# (.NET): bibliotecas y ejemplos de código
Trabajo con imágenes en Kotlin: bibliotecas, herramientas y ejemplos
Registro para Swift: biblioteca SwiftyBeaver
Trabajo con Markdown en Rust: bibliotecas y herramientas
Tokens JWT en C# (.NET): trabajo con System.IdentityModel.Tokens.Jwt