diff --git a/static/assets/weblog/note-taking-experimental/note-creation.png b/static/assets/weblog/note-taking-experimental/note-creation.png new file mode 100644 index 0000000..b631883 Binary files /dev/null and b/static/assets/weblog/note-taking-experimental/note-creation.png differ diff --git a/static/assets/weblog/note-taking-experimental/note-list.png b/static/assets/weblog/note-taking-experimental/note-list.png new file mode 100644 index 0000000..bf37274 Binary files /dev/null and b/static/assets/weblog/note-taking-experimental/note-list.png differ diff --git a/static/assets/weblog/note-taking-experimental/password-prompt.png b/static/assets/weblog/note-taking-experimental/password-prompt.png new file mode 100644 index 0000000..3a40b95 Binary files /dev/null and b/static/assets/weblog/note-taking-experimental/password-prompt.png differ diff --git a/static/assets/weblog/note-taking-experimental/top-buttons.png b/static/assets/weblog/note-taking-experimental/top-buttons.png new file mode 100644 index 0000000..d835724 Binary files /dev/null and b/static/assets/weblog/note-taking-experimental/top-buttons.png differ diff --git a/weblog.md b/weblog.md index 4894c53..7968097 100644 --- a/weblog.md +++ b/weblog.md @@ -8,4 +8,5 @@ title: weblog Aquí iré hablando sobre ideas, experiencias y demás cosas que podrían ser relevantes! ### 2023 -1. [Primer post](/weblog/firstpost) El nacimiento de mi weblog! :) +- [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/weblog/note-taking-experiment.md b/weblog/note-taking-experiment.md new file mode 100644 index 0000000..f7033a4 --- /dev/null +++ b/weblog/note-taking-experiment.md @@ -0,0 +1,116 @@ +--- +layout: post.njk +title: Note Taking. Notas encriptadas +tags: + - rust + - experimentos + - note taking +date: 2023-03-12 +--- + +He estado un par de semanas experimentando con un concepto relativamente simple: _un programa que permita crear y +almacenar notas encriptadas_. + +Este concepto es sencillo, pero la ejecución es lo importante. Me establecí una serie de objetivos que permitieran +poder establecer una base sobre la que trabajar, y estos objetivos eran los siguientes: +- **Simple**. Una aplicación fácil de usar para todo el mundo, con y sin conocimientos. +- **Seguro**. Las notas no deben ser susceptibles de ataques de fuerza bruta y compañía. +- **Completo**. Se debe ofrecer una gran variedad de opciones y posibilidades a la hora de redactar y ver las notas. + +Y pese a que el proyecto aún está siendo activamente desarrollado para poder cumplir todos los objetivos, creo que +ya se encuentra en un estado en el que puedo mostrar más sobre él y explicar ciertas decisiones. + +## motivación + +Un día me di cuenta que mi _setup_ para tomar notas era bastante engorroso: abría el bloc de notas, escribía, guardaba +el .txt, abría [Kleopatra](https://www.gpg4win.org/about.html), esperaba a que se cargara la base de datos, abría el +Bloc de Notas de Kleopatra, cifraba y firmaba el texto usando una clave específica, y finalmente lo guardaba de vuelta +en el .txt original. + +No es difícil darse cuenta de que este sistema no era _el óptimo_. Por tanto, decidí embarcarme en la búsqueda de +algún programa que cumpliera los siguientes requisitos: +1. **Offline**. No quiero mis notas, encriptadas o no, viajando por lugares desconocidos. +2. **Seguro**. No quiero mis notas siendo desencriptadas por alguna vulnerabilidad o problema de diseño. +3. **Simple**. No quiero tener que dar mil vueltas para escribir un documento de 50 palabras. + +Y todo lo que encontraba no cumplía todos los requisitos: o tenía _sincronización en la nube_, o la interfaz era muy +compleja, etc. + +Por tanto, decidí que debía arreglar esto yo misma: y así surgió +[note taking](https://git.sofiaritz.com/sofia/note-taking). + +## funcionamiento + +note taking tiene un funcionamiento bastante sencillo. Cuando abres la aplicación ocurre lo siguiente: +1. Te pide que introduzcas la contraseña utilizada para encriptar la "_base de datos_". +2. Comprueba la contraseña utilizando notas existentes. +3. Si es correcta, carga todas las notas encriptadas en memoria para ser desencriptadas bajo demanda. + +Una vez has pasado esta etapa inicial, todo es muy intuitivo. Para añadir una nota haces click en el botón que dice +"_want to add one note?_", para desencriptar una nota haces click en el botón que dice "_decrypt note_", etc. + +Además de esto, el apartado de configuración actualmente tiene la opción de exportar las notas en formato JSON para +poder ser importadas por programas compatibles con el formato. En un futuro el apartado de configuración tendrá más +opciones, como importar notas, cambiar la contraseña y demás. + +## seguridad + +Recientemente, se cambió como se manejaban las contraseñas en note taking. Ahora mismo se sigue el siguiente sistema: +1. El usuario introduce la contraseña +2. La contraseña pasa por una función de derivación +([KDF](https://crypto.stackexchange.com/questions/40757/key-derivation-functions-kdf-what-are-they-what-are-their-main-purposes-and)) + 1. Se calcula el SHA256 de la contraseña, que se utilizará como + [_salt_](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#salting). + 2. Se usa [Argon2](https://en.wikipedia.org/wiki/Argon2) para crear el hash de la contraseña. + 3. Se codifica el resultado en hexadecimal. +3. Se utiliza [pwbox](https://docs.rs/pwbox/0.5.0/pwbox/) con la contraseña derivada. + +Este sistema evita que se puedan forzar las contraseñas: +1. Todas las contraseñas tienen gran entropía al salir del KDF. +2. El KDF tiene gran complejidad, lo que ralentiza los ataques de fuerza bruta. + +Además de esto, se utilizan ciertos sistemas para _sugerir_ al usuario el uso de contraseñas seguras. Un ejemplo de esto +es cómo se le muestran al usuario tanto la longitud como entropía de la contraseña introducida con un sistema de colores +bastante explícito que _invita_ al usuario a emplear contraseñas seguras. + +Todo esto se puede ver en mayor detalle en +[_Security of the encrypted notes_ · sofia@git.sofiaritz.com/note-taking#1](https://git.sofiaritz.com/sofia/note-taking/issues/1). + +## planes de futuro + +En el futuro me gustaría añadir un sistema "_Markdown_" básico para que se puedan añadir cosas como letra en cursiva, +negrita, imágenes, etc. + +Pese a que esto pueda parecer relativamente sencillo, especialmente teniendo en cuenta que +[ya existen librerías](https://crates.io/crates/egui_commonmark) que se encargan de esto, cosas como imágenes pueden +ser un gran vector de ataque para intentar desanonimizar u obtener información del usuario. Por tanto, esta clase de +decisiones deben ser tomadas con mucho estudio y cautela. + +Además de esto, me gustaría mejorar la privacidad de ciertos aspectos de las notas (metadatos, etc.) y expandir los +ajustes. + +## quiero probarlo! + +Ahora mismo [no estoy distribuyendo ejecutables](https://git.sofiaritz.com/sofia/note-taking/issues/2), pero es muy +fácil compilar el proyecto si ya tienes Rust y Cargo! + +Si ya tienes Rust y Cargo [instalados](https://www.rust-lang.org/tools/install) y +[actualizados](https://rust-lang.github.io/rustup/basics.html#keeping-rust-up-to-date), ejecuta los siguientes comandos: +1. `git clone https://git.sofiaritz.com/sofia/note-taking.git` +2. `cd note-taking` +3. `cargo run --release` + +(Si el último paso falla, puede que tengas que utilizar `cargo +nightly build --release`) + +## ideas? + +Cualquier idea es bienvenida! [Ponte en contacto conmigo](/contact) o abre una +[issue](https://git.sofiaritz.com/sofia/note-taking/issues) en el repositorio. :) + +## imágenes + + + + + +