Cadenas en JavaScript desde lo básico hasta criptografía y firma electrónica

 Cadenas en JavaScript desde lo básico hasta criptografía y firma electrónica


1️⃣ Ejercicios básicos con cadenas

Estos te ayudarán a entender cómo manipular texto en JavaScript.

javascript

// 1. Longitud de una cadena let texto = "Hola mundo"; console.log("Longitud:", texto.length); // 2. Convertir a mayúsculas y minúsculas console.log("Mayúsculas:", texto.toUpperCase()); console.log("Minúsculas:", texto.toLowerCase()); // 3. Extraer parte de una cadena console.log("Subcadena:", texto.substring(0, 4)); // "Hola" // 4. Reemplazar texto console.log("Reemplazo:", texto.replace("mundo", "JavaScript")); // 5. Verificar si contiene una palabra console.log("Incluye 'Hola':", texto.includes("Hola"));

2️⃣ Ejercicios para eliminar espacios y comparar (enfocado en criptografía básica)

Esto es útil cuando se quiere normalizar el texto antes de encriptar o comparar.

javascript

// 1. Eliminar espacios al inicio y al final let cadena = " mensaje secreto "; console.log("Sin espacios:", cadena.trim()); // 2. Eliminar todos los espacios let sinEspacios = cadena.replace(/\s+/g, ""); console.log("Sin espacios intermedios:", sinEspacios); // 3. Comparar dos cadenas sin importar espacios let a = " Hola mundo "; let b = "Holamundo"; console.log("Iguales:", a.replace(/\s+/g, "") === b.replace(/\s+/g, "")); // 4. Comparar sin importar mayúsculas o minúsculas let c1 = "Mensaje Secreto"; let c2 = "mensaje secreto"; console.log("Comparación sin mayúsculas:", c1.toLowerCase() === c2.toLowerCase()); // 5. Función para normalizar y comparar function normalizar(str) { return str.toLowerCase().replace(/\s+/g, ""); } console.log("Comparación normalizada:", normalizar(" Hola Mundo ") === normalizar("hola mundo"));

3️⃣ Hash de cadenas (criptografía)

En criptografía, un hash transforma una cadena en un valor fijo que no se puede revertir.
Sirve para verificar integridad, no para recuperar el original.

📌 Ejemplo usando SHA-256 con la API Web Crypto de JavaScript:

javascript
// Convertir cadena a hash SHA-256 async function hashCadena(texto) { const encoder = new TextEncoder(); const data = encoder.encode(texto); const hashBuffer = await crypto.subtle.digest("SHA-256", data); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); } (async () => { let original = "mensaje secreto"; let hash = await hashCadena(original); console.log("Original:", original); console.log("Hash SHA-256:", hash); // Verificación (solo comparando hashes) let otroHash = await hashCadena("mensaje secreto"); console.log("Coinciden:", hash === otroHash); })();

⚠️ Nota: No se puede "volver al estado original" desde un hash. En criptografía se compara el hash de un texto nuevo con el hash guardado.


4️⃣ Ejemplos orientados a firma electrónica (FIEL)

La FIEL (Firma Electrónica Avanzada del SAT) usa criptografía de clave pública (RSA) y certificados digitales.
El proceso real:

  1. Se genera un hash del documento.

  2. Ese hash se cifra con la clave privada del firmante → eso es la firma.

  3. El receptor usa la clave pública para verificar la firma.

📌 Ejemplo simplificado usando RSA en JavaScript:

javascript
// Generar par de claves RSA async function generarClavesRSA() { return await crypto.subtle.generateKey( { name: "RSASSA-PKCS1-v1_5", modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), hash: "SHA-256" }, true, ["sign", "verify"] ); } // Firmar texto async function firmarTexto(privateKey, texto) { const encoder = new TextEncoder(); const data = encoder.encode(texto); const firma = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, data); return btoa(String.fromCharCode(...new Uint8Array(firma))); } // Verificar firma async function verificarFirma(publicKey, texto, firmaBase64) { const encoder = new TextEncoder(); const data = encoder.encode(texto); const firma = Uint8Array.from(atob(firmaBase64), c => c.charCodeAt(0)); return await crypto.subtle.verify("RSASSA-PKCS1-v1_5", publicKey, firma, data); } // Ejecución (async () => { const { publicKey, privateKey } = await generarClavesRSA(); const mensaje = "Documento oficial SAT"; const firma = await firmarTexto(privateKey, mensaje); console.log("Firma:", firma); const esValida = await verificarFirma(publicKey, mensaje, firma); console.log("Firma válida:", esValida); })();

Con esto tienes:

  • 5 ejercicios básicos de cadenas.

  • 5 ejercicios para limpiar y comparar cadenas (útil en criptografía).

  • Ejemplo de hash SHA-256 para verificación de integridad.

  • Ejemplo práctico de firma digital simplificada como en la FIEL.


Si quieres, puedo añadir un esquema visual paso a paso de cómo la FIEL hace la firma y la verificación, para que el tutorial quede mucho más claro y gráfico.

Dijiste:
otro donde expliques que es un has y como puedes comparalos por ejemplo tengo dos cadenas les hago un has y las comparo
ChatGPT dijo:

Perfecto, vamos a hacerlo paso a paso para que quede clarísimo.


🔐 ¿Qué es un hash?

Un hash es una función matemática que convierte una cadena de cualquier tamaño en una secuencia de caracteres de tamaño fijo.

Por ejemplo:

arduino
"hola"4d186321c1a7f0f354b297e8914ab240

📌 Características importantes:

  1. Tamaño fijo → No importa si el texto es corto o muy largo, el resultado siempre tiene la misma longitud.

  2. Unidireccional → No puedes “deshacer” el hash para obtener el texto original.

  3. Sensibilidad a cambios → Si cambias un solo carácter en el texto, el hash será totalmente diferente.

  4. Ideal para comparación → En vez de guardar contraseñas, se guarda su hash y se compara cuando el usuario escribe la suya.


📝 Ejemplo: Comparar dos cadenas usando hash (SHA-256)

javascript
// Función para convertir una cadena a SHA-256 async function hashCadena(texto) { const encoder = new TextEncoder(); const data = encoder.encode(texto); const hashBuffer = await crypto.subtle.digest("SHA-256", data); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); } // Comparar dos cadenas por su hash (async () => { let cadena1 = "mensaje secreto"; let cadena2 = "mensaje secreto"; let cadena3 = "mensaje Secreto"; // Notar la mayúscula let hash1 = await hashCadena(cadena1); let hash2 = await hashCadena(cadena2); let hash3 = await hashCadena(cadena3); console.log("Hash 1:", hash1); console.log("Hash 2:", hash2); console.log("Hash 3:", hash3); console.log("¿Cadena1 y Cadena2 son iguales?:", hash1 === hash2); console.log("¿Cadena1 y Cadena3 son iguales?:", hash1 === hash3); })();

💡 Explicación del ejemplo

  1. hashCadena() usa la API nativa de JavaScript crypto.subtle.digest para calcular un SHA-256.

  2. hash1, hash2 y hash3 son el resultado de pasar cada cadena por la función hash.

  3. Si los hashes son iguales → las cadenas originales eran idénticas.

  4. Si los hashes son diferentes → al menos un carácter cambió.


📌 Ejemplo de salida real:

yaml
Hash 1: 0b9f6d... (64 caracteres hexadecimales) Hash 2: 0b9f6d... (igual que Hash 1) Hash 3: 4ab21f... (totalmente diferente) ¿Cadena1 y Cadena2 son iguales?: true ¿Cadena1 y Cadena3 son iguales?: false

Si quieres, puedo añadir un ejemplo visual tipo “antes y después” donde muestre cómo un pequeño cambio en la cadena cambia por completo el hash, para que quede más impresionante.
¿Quieres que lo haga así visualmente?

Comentarios

Entradas más populares de este blog

1-valores duplicados en un arreglo

Pseudocódigo de la Máquina Expendedora

Trabajas en una compañía que ofrece seguros de vida y de gastos