Cadenas en JavaScript desde lo básico hasta criptografía y firma electrónica
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
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:
-
Se genera un hash del documento.
-
Ese hash se cifra con la clave privada del firmante → eso es la firma.
-
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:
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:
-
Tamaño fijo → No importa si el texto es corto o muy largo, el resultado siempre tiene la misma longitud.
-
Unidireccional → No puedes “deshacer” el hash para obtener el texto original.
-
Sensibilidad a cambios → Si cambias un solo carácter en el texto, el hash será totalmente diferente.
-
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
-
hashCadena() usa la API nativa de JavaScript
crypto.subtle.digestpara calcular un SHA-256. -
hash1,hash2yhash3son el resultado de pasar cada cadena por la función hash. -
Si los hashes son iguales → las cadenas originales eran idénticas.
-
Si los hashes son diferentes → al menos un carácter cambió.
📌 Ejemplo de salida real:
yamlHash 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?
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Comentarios
Publicar un comentario