This repository has been archived on 2023-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
website/weblog/note-taking-experiment.md

6.8 KiB

layout title tags date
post.njk Note Taking. Notas encriptadas
rust
experimentos
note taking
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, 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.

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)
    1. Se calcula el SHA256 de la contraseña, que se utilizará como salt.
    2. Se usa Argon2 para crear el hash de la contraseña.
    3. Se codifica el resultado en hexadecimal.
  3. Se utiliza 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.

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 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, pero es muy fácil compilar el proyecto si ya tienes Rust y Cargo!

Si ya tienes Rust y Cargo instalados y actualizados, 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 o abre una issue en el repositorio. :)

imágenes

Captura de pantalla donde se muestra una entrada de texto con los valores de entropía y longitud a la derecha en color verde, indicando así valores aceptables. Captura de pantalla donde se muestran los botones 'want to add one note?' y 'settings' Captura de pantalla donde se muestra la lista de notas. En cada nota se muestra el título y su derecha la fecha. Bajo el título hay un botón que indica 'decrypt note' Captura de pantalla donde se muestra el formulario de creación de notas, con diversas entradas de texto para el título, texto y metadatos. Al final hay un botón con el texto 'add note'