diff --git a/package.json b/package.json index 2dc36f3..fc6ebdc 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "scripts": { "serve": "npx @11ty/eleventy --serve", "build": "npx @11ty/eleventy", - "deploy": "cd _scripts && ./deploy.sh" + "deploy": "cd _scripts && ./deploy.sh", + "ascii_to_svg": "cd _scripts/ascii && ./to_ascii.sh" }, "devDependencies": { "@11ty/eleventy": "^2.0.0", diff --git a/src/weblog.md b/src/weblog.md index 7968097..630a9ae 100644 --- a/src/weblog.md +++ b/src/weblog.md @@ -8,5 +8,6 @@ title: weblog Aquí iré hablando sobre ideas, experiencias y demás cosas que podrían ser relevantes! ### 2023 +- [Note Taking (II). Retos](/weblog/note-taking-2) Retos encontrados por el camino - [Note Taking. Notas encriptadas](/weblog/note-taking-experiment) Un programa experimental para encriptar notas. - [Primer post](/weblog/firstpost) El nacimiento de mi weblog! :) diff --git a/src/weblog/note-taking-2.md b/src/weblog/note-taking-2.md new file mode 100644 index 0000000..d7be305 --- /dev/null +++ b/src/weblog/note-taking-2.md @@ -0,0 +1,97 @@ +--- +layout: post.njk +title: Note Taking (II). Retos +tags: + - rust + - experimentos + - note taking +date: 2023-05-06 +--- + +Hace unos meses comencé a crear [Note Taking](https://git.sofiaritz.com/sofia/note-taking), una aplicación cuyo +propósito era la creación de un software que permitiera crear notas encriptadas de una manera sencilla y segura. + +Surgió como un prototipo [sobre el que fui iterando](/weblog/note-taking-experiment) hasta llegar a lo que es hoy día: +una plataforma relativamente estable, simple y segura para crear notas. + +Pese a que el concepto es sencillo, en la ejecución lo está todo. Y ahí se yace el propósito de este artículo: mostrar +los retos que me he encontrado en este camino. + +## seguridad + +La seguridad es sin duda uno de los apartados más importantes y complejos de este software. A día de hoy el sistema +utilizado es el siguiente: + + + +Este sistema actualmente funciona bien: +* Todas las contraseñas tienen una alta entropía gracias al uso de Argon2 (un [KDF](https://es.wikipedia.org/wiki/Funci%C3%B3n_de_derivaci%C3%B3n_de_clave)). +* [pwbox](https://github.com/exonum/pwbox-rs) se encarga de encriptar las notas usando el resultado derivado de la +contraseña original. + +Pero ello no implica que tenga algunos problemas, en especial **la imposibilidad de cambiar contraseñas**. + +## cambio de contraseñas + +En un software como este, es frecuente que el usuario quiera cambiar de contraseñas ocasionalmente por variadas razones: +cambio rutinario preventivo, contraseñas que han sido expuestas, etc. + +El sistema actual impide que esto sea posible, pues la contraseña es la base de la encriptación. A día de hoy para poder +cambiar la contraseña sería necesario ir nota por nota desencriptándola y reencriptándola. Esto es un proceso que puede +parecer [sencillo](https://git.sofiaritz.com/sofia/note-taking/src/commit/c97700b29aba660ffe7b6753266d6559a84b8d01/src/password/mod.rs#L59), +pero en cuanto el número de notas crece, una operación de este tipo se vuelve imposible de manejar. + +### posibles soluciones + +Existen varios caminos que se pueden tomar para solucionar esto, pero el que creo que va a ser utilizado va a ser el +siguiente: + +Cada nota contiene una clave única que es la utilizada para encriptar los contenidos de la misma. Esta clave única, +antes de ser almacenada en los _metadatos_ de la nota pasa por el sistema [descrito anteriormente](#seguridad). + +Esto permite lo siguiente: +* Cada nota tiene su clave única de encriptación, por lo tanto, un ataque de fuerza bruta directamente en la nota pierde +utilidad. +* El uso de una clave de encriptación única y permanente por nota permite que el cambio de la contraseña solo tenga que +afectar a un centenar de bits en lugar de varios miles de bits, pues únicamente habría que reencriptar la clave de +cada nota. + +## metadatos + +A día de hoy, todos los metadatos (título, metadatos explícitos, fecha, etc) están sin encriptar. Esto es algo bastante +delicado, pues muchas veces los metadatos son mucho más _dañinos_ de lo que nos podemos imaginar. + +Tengo pensado crear un archivo especial para las notas que pueda contener todas las notas de una manera centralizada +y segura. En un principio una nota tendría una estructura similar a la siguiente: + +* Longitud de la clave encriptada +* Clave encriptada +* Longitud de los metadatos +* Metadatos en JSON encriptados +* Longitud de la nota +* Nota encriptada +* Checksum de la nota + +Además de esto, el archivo estaría versionado y trataría de ser lo más escalable posible en lo que a futuros _metadatos +especiales_ (fecha, autor, etc) respecta. + +## riqueza + +A día de hoy las notas son simplemente texto plano. Otra de las cosas que tengo pensadas añadir es soporte básico de +Markdown (únicamente cosas como **negrita**, _cursiva_, ~~tachado~~, etc.) + +Me encantaría añadir soporte para imágenes, pero usando Markdown _estándar_ es peligroso para la seguridad de los +usuarios. Una alternativa sería aprovechar la creación de un archivo personalizado para añadir una sección de +información arbitraria que funcionara como un [diccionario](https://en.wikipedia.org/wiki/Associative_array), donde cada +conjunto de datos arbitrarios tuviera asociado un identificador único que pudiera ser referenciado en Markdown. + +Pese a ello, esto abre un gran vector de ataque que habría que cuidar, por tanto, el soporte de imágenes es algo que +seguramente tendrá que esperar. + +## conclusión + +Sin duda crear este software está siendo una experiencia bastante interesante que me está ayudando a aprender sobre +seguridad computacional y muchas otras cosas. + +A lo largo de los meses venideros trataré de implementar estas y más cosas, subiré una actualización cuando ello ocurra +:) diff --git a/static/assets/weblog/note-taking-2/diagram1.svg b/static/assets/weblog/note-taking-2/diagram1.svg new file mode 100644 index 0000000..81f58d7 --- /dev/null +++ b/static/assets/weblog/note-taking-2/diagram1.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +H +A +2 +5 +6 +S +a +l +t +N +o +t +a +d +e +s +e +n +c +r +i +p +t +a +d +a +C +o +n +t +r +a +s +e +ñ +a +A +r +g +o +n +2 +p +w +b +o +x +N +o +t +a +e +n +c +r +i +p +t +a +d +a + +