[{"data":1,"prerenderedAt":254},["ShallowReactive",2],{"\u002Fprojects\u002Fcipher":3,"posts":216},{"id":4,"title":5,"body":6,"description":157,"extension":158,"featured":159,"images":160,"links":179,"meta":183,"navigation":159,"order":145,"path":184,"seo":185,"stack":186,"stats":199,"stem":212,"tag":213,"url":214,"__hash__":215},"projects\u002Fprojects\u002Fcipher.md","ABR Cipher",{"type":7,"value":8,"toc":143},"minimark",[9,14,61,65,70,74,78,81,85,88,92,95,99,106,110],[10,11,13],"h2",{"id":12},"qué-hace","Qué hace",[15,16,17,25,31,37,43,49,55],"ul",{},[18,19,20,24],"li",{},[21,22,23],"strong",{},"Cifrar texto."," AES-256-GCM con contraseña, varias contraseñas encadenadas o la clave pública del destinatario. El resultado se comparte como texto, enlace o código QR.",[18,26,27,30],{},[21,28,29],{},"Cifrar archivos de varios GB."," Por trozos, escribiendo directamente a disco, sin cargar el archivo entero en memoria.",[18,32,33,36],{},[21,34,35],{},"Notas que caducan."," El mensaje cifrado viaja dentro del propio enlace, con caducidad de una hora a siete días.",[18,38,39,42],{},[21,40,41],{},"Vault de contraseñas."," Cifrado en el propio navegador y con bloqueo automático.",[18,44,45,48],{},[21,46,47],{},"Borrado seguro."," Sobrescribe archivos y carpetas en varias pasadas, la última con datos aleatorios.",[18,50,51,54],{},[21,52,53],{},"Quince herramientas más."," Firmas digitales, códigos 2FA, JWT, HMAC, hashes, esteganografía, limpieza de metadatos EXIF, ZIP cifrados, generador de contraseñas, inspector de certificados X.509 y análisis de entropía y frecuencias.",[18,56,57,60],{},[21,58,59],{},"Funciona sin conexión."," Es una PWA, está en 4 idiomas (español, inglés, francés y chino) y tiene modo oscuro.",[10,62,64],{"id":63},"cómo-está-hecho","Cómo está hecho",[66,67,69],"h3",{"id":68},"sin-servidor-por-diseño","Sin servidor, por diseño",[71,72,73],"p",{},"No hay backend que atacar, ni cuentas, ni una sola petición de red con datos sensibles. Es una SPA estática: todo el cifrado ocurre en el dispositivo del usuario.",[66,75,77],{"id":76},"solo-la-criptografía-del-navegador","Solo la criptografía del navegador",[71,79,80],{},"Todas las operaciones usan la Web Crypto API nativa, sin librerías criptográficas de terceros. La mantienen y auditan los fabricantes de navegadores, usa aceleración por hardware y no añade ni un byte ni un riesgo de cadena de suministro.",[66,82,84],{"id":83},"archivos-grandes-sin-agotar-la-memoria","Archivos grandes sin agotar la memoria",[71,86,87],{},"Los archivos se cifran en trozos de 64 MB con un formato propio con cabecera mágica, y se escriben directamente a disco con la File System Access API. El trabajo pesado va en Web Workers que, si no pueden arrancar, vuelven al hilo principal.",[66,89,91],{"id":90},"capas-estrictas-y-decisiones-por-escrito","Capas estrictas y decisiones por escrito",[71,93,94],{},"La lógica son funciones puras en TypeScript, testeables sin montar componentes. Los composables orquestan el estado y los componentes solo pintan: un componente nunca importa la lógica directamente. Cada decisión importante está documentada en un ADR.",[66,96,98],{"id":97},"un-compañero-nativo-en-rust","Un compañero nativo en Rust",[71,100,101,105],{},[102,103,104],"code",{},"cipher-shred"," es una herramienta opcional en Rust que hace lo que el navegador no puede: escribir saltándose la caché del sistema y borrar la entrada del archivo. Incluye un motor que lee el sistema de archivos NTFS directamente para recuperar archivos borrados por error. Todavía no está publicado.",[10,107,109],{"id":108},"problemas-que-resolví","Problemas que resolví",[15,111,112,122,128,134],{},[18,113,114,117,118,121],{},[21,115,116],{},"Compartir un secreto sin servidor que lo guarde."," El mensaje cifrado viaja en el fragmento ",[102,119,120],{},"#"," de la URL, que los navegadores nunca envían al servidor por especificación.",[18,123,124,127],{},[21,125,126],{},"Archivos cifrados que salían vacíos."," Al cifrar un único archivo con el worker, el flujo de escritura nunca se cerraba y el resultado quedaba en 0 bytes. Ahora se cierra siempre, y hay un test que lo comprueba.",[18,129,130,133],{},[21,131,132],{},"Workers que se colgaban sin avisar."," Si un worker fallaba al arrancar, nadie se enteraba: la operación se quedaba esperando para siempre y nunca se usaba el respaldo. Ahora los errores del worker llegan al mismo manejador que el resto, en los cuatro workers.",[18,135,136,139,140,142],{},[21,137,138],{},"Leer un disco NTFS sin confiar en lo que contiene."," El parser de ",[102,141,104],{}," comprueba todos los límites antes de leer, valida cada sector antes de modificar nada y nunca escribe en el volumen que analiza.",{"title":144,"searchDepth":145,"depth":145,"links":146},"",2,[147,148,156],{"id":12,"depth":145,"text":13},{"id":63,"depth":145,"text":64,"children":149},[150,152,153,154,155],{"id":68,"depth":151,"text":69},3,{"id":76,"depth":151,"text":77},{"id":83,"depth":151,"text":84},{"id":90,"depth":151,"text":91},{"id":97,"depth":151,"text":98},{"id":108,"depth":145,"text":109},"Suite de cifrado que funciona entera en el navegador. Texto y archivos de varios GB con AES-256-GCM, notas que caducan, vault de contraseñas, borrado seguro y quince herramientas más. Sin servidor, sin cuentas y sin telemetría.","md",true,[161,166,171,175],{"src":162,"alt":163,"width":164,"height":165},"\u002Fimages\u002Fposts\u002Fabr-cipher\u002Fportada.webp","La portada de ABR Cipher con sus diecinueve módulos",1440,900,{"src":167,"alt":168,"width":169,"height":170},"\u002Fimages\u002Fposts\u002Fabr-cipher\u002Ftexto.webp","Un texto cifrado con AES-256-GCM, listo para compartir",784,1191,{"src":172,"alt":173,"width":169,"height":174},"\u002Fimages\u002Fposts\u002Fabr-cipher\u002Fnota.webp","Una nota cifrada convertida en enlace que caduca",652,{"src":176,"alt":177,"width":169,"height":178},"\u002Fimages\u002Fposts\u002Fabr-cipher\u002Fdestruir.webp","El módulo de borrado seguro",578,[180],{"label":181,"url":182},"Cómo se usa","\u002Fposts\u002Fabr-cipher-cifrado-en-tu-navegador",{},"\u002Fprojects\u002Fcipher",{"title":5,"description":157},[187,188,189,190,191,192,193,194,195,196,197,198],"Nuxt 4","Vue 3","TypeScript","Web Crypto API","Web Workers","File System Access API","Pinia","Tailwind CSS","Rust","Vitest","Testing Library","Playwright",[200,203,206,209],{"value":201,"label":202},"19","módulos",{"value":204,"label":205},"~670","tests (Vitest)",{"value":207,"label":208},"9","decisiones documentadas (ADR)",{"value":210,"label":211},"~450","commits desde mar. 2026","projects\u002Fcipher","cipher","https:\u002F\u002Fabdell1999.github.io\u002Fcipher-public\u002F","PUuDaVZ_ZXiFFNzAHcVbzobOFuh0P9tJrL53Zl9tnJc",[217,225,233,240,246],{"title":218,"description":219,"date":220,"path":182,"tags":221},"ABR Cipher: cifrado seguro, completamente en tu navegador","Una suite de cifrado que no envía nada a ningún servidor. Cifrar textos y archivos, compartir secretos con un enlace que caduca, guardar contraseñas y destruir archivos. Qué hace y cómo se usa.","2026-10-18",[213,222,223,224],"seguridad","privacidad","proyectos",{"title":226,"description":227,"date":220,"path":228,"tags":229},"ABR Cipher por dentro: criptografía sin servidor, de la URL al disco","Por qué ABR Cipher solo usa la Web Crypto API, cómo viaja un secreto en el fragmento de una URL, cómo se cifra un archivo de varios GB en el navegador y qué hace falta para destruir un archivo de verdad, con un compañero en Rust que lee NTFS.","\u002Fposts\u002Fabr-cipher-por-dentro",[213,222,230,231,232],"arquitectura","typescript","rust",{"title":234,"description":235,"date":220,"path":236,"tags":237},"ABReader por dentro: el lector que no encontré, construido a mi medida","Voces neuronales que se ejecutan en el navegador, sincronización entre dispositivos sin servidor y once formatos detrás de un mismo contrato. Las decisiones técnicas de ABReader y por qué las tomé.","\u002Fposts\u002Fabreader-por-dentro",[238,230,231,239],"abreader","nuxt",{"title":241,"description":242,"date":220,"path":243,"tags":244},"ABReader: tu biblioteca de libros electrónicos en el navegador","Un lector de libros electrónicos que funciona en el navegador, sin cuentas ni servidores. Qué hace, cómo se usa y cómo probarlo en un minuto.","\u002Fposts\u002Fabreader-tu-biblioteca-en-el-navegador",[238,245,224],"lectura",{"title":247,"description":248,"date":220,"path":249,"tags":250},"Cómo construí este blog: estático, sin servidor y sin coste de hosting","Por qué elegí Nuxt y Markdown en lugar de WordPress, cómo separo el código privado del sitio publicado y qué se rompió en el primer despliegue.","\u002Fposts\u002Farquitectura-de-este-blog",[239,251,252,253],"vue","devops","meta",1792430530367]