Add a new Spanish post: note-taking-2.md
This commit is contained in:
parent
ecd6ca2809
commit
7d69d6d65e
4 changed files with 224 additions and 1 deletions
|
@ -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",
|
||||
|
|
|
@ -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! :)
|
||||
|
|
97
src/weblog/note-taking-2.md
Normal file
97
src/weblog/note-taking-2.md
Normal file
|
@ -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:
|
||||
|
||||
<img src="/assets/weblog/note-taking-2/diagram1.svg" width="100%">
|
||||
|
||||
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
|
||||
:)
|
124
static/assets/weblog/note-taking-2/diagram1.svg
Normal file
124
static/assets/weblog/note-taking-2/diagram1.svg
Normal file
|
@ -0,0 +1,124 @@
|
|||
<svg xmlns='http://www.w3.org/2000/svg' version='1.1' height='153' width='784' font-family='Menlo,Lucida Console,monospace'>
|
||||
<style type="text/css">
|
||||
svg {
|
||||
color: #000000;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
svg {
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<g transform='translate(8,16)'>
|
||||
<path d='M 288,0 L 344,0' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 232,16 L 280,16' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 352,16 L 400,16' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 288,32 L 344,32' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 0,96 L 152,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 192,96 L 232,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 232,96 L 280,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 368,96 L 424,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 528,96 L 576,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 640,96 L 768,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 160,112 L 184,112' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 288,112 L 360,112' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 432,112 L 520,112' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 584,112 L 632,112' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 0,128 L 152,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 192,128 L 280,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 368,128 L 424,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 528,128 L 576,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 640,128 L 768,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 0,96 L 0,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 152,96 L 152,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 192,96 L 192,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 232,16 L 232,96' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 280,96 L 280,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 288,0 L 288,32' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 344,0 L 344,32' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 368,96 L 368,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 400,16 L 400,80' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 424,96 L 424,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 528,96 L 528,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 576,96 L 576,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 640,96 L 640,128' fill='none' stroke='currentColor'></path>
|
||||
<path d='M 768,96 L 768,128' fill='none' stroke='currentColor'></path>
|
||||
<polygon points='192.000000,112.000000 180.000000,106.400002 180.000000,117.599998' fill='currentColor' transform='rotate(0.000000, 184.000000, 112.000000)'></polygon>
|
||||
<polygon points='288.000000,16.000000 276.000000,10.400000 276.000000,21.600000' fill='currentColor' transform='rotate(0.000000, 280.000000, 16.000000)'></polygon>
|
||||
<polygon points='368.000000,112.000000 356.000000,106.400002 356.000000,117.599998' fill='currentColor' transform='rotate(0.000000, 360.000000, 112.000000)'></polygon>
|
||||
<path d='M 400,80 L 400,88' fill='none' stroke='currentColor'></path>
|
||||
<polygon points='416.000000,80.000000 404.000000,74.400002 404.000000,85.599998' fill='currentColor' transform='rotate(90.000000, 400.000000, 80.000000)'></polygon>
|
||||
<polygon points='528.000000,112.000000 516.000000,106.400002 516.000000,117.599998' fill='currentColor' transform='rotate(0.000000, 520.000000, 112.000000)'></polygon>
|
||||
<polygon points='640.000000,112.000000 628.000000,106.400002 628.000000,117.599998' fill='currentColor' transform='rotate(0.000000, 632.000000, 112.000000)'></polygon>
|
||||
<style>
|
||||
text {
|
||||
text-anchor: middle;
|
||||
font-family: "Menlo","Lucida Console","monospace";
|
||||
fill: currentColor;
|
||||
font-size: 1em;
|
||||
}
|
||||
</style>
|
||||
<text x='296' y='20'>S</text>
|
||||
<text x='304' y='20'>H</text>
|
||||
<text x='312' y='20'>A</text>
|
||||
<text x='320' y='20'>2</text>
|
||||
<text x='328' y='20'>5</text>
|
||||
<text x='336' y='20'>6</text>
|
||||
<text x='408' y='52'>S</text>
|
||||
<text x='416' y='52'>a</text>
|
||||
<text x='424' y='52'>l</text>
|
||||
<text x='432' y='52'>t</text>
|
||||
<text x='8' y='116'>N</text>
|
||||
<text x='16' y='116'>o</text>
|
||||
<text x='24' y='116'>t</text>
|
||||
<text x='32' y='116'>a</text>
|
||||
<text x='48' y='116'>d</text>
|
||||
<text x='56' y='116'>e</text>
|
||||
<text x='64' y='116'>s</text>
|
||||
<text x='72' y='116'>e</text>
|
||||
<text x='80' y='116'>n</text>
|
||||
<text x='88' y='116'>c</text>
|
||||
<text x='96' y='116'>r</text>
|
||||
<text x='104' y='116'>i</text>
|
||||
<text x='112' y='116'>p</text>
|
||||
<text x='120' y='116'>t</text>
|
||||
<text x='128' y='116'>a</text>
|
||||
<text x='136' y='116'>d</text>
|
||||
<text x='144' y='116'>a</text>
|
||||
<text x='200' y='116'>C</text>
|
||||
<text x='208' y='116'>o</text>
|
||||
<text x='216' y='116'>n</text>
|
||||
<text x='224' y='116'>t</text>
|
||||
<text x='232' y='116'>r</text>
|
||||
<text x='240' y='116'>a</text>
|
||||
<text x='248' y='116'>s</text>
|
||||
<text x='256' y='116'>e</text>
|
||||
<text x='264' y='116'>ñ</text>
|
||||
<text x='272' y='116'>a</text>
|
||||
<text x='376' y='116'>A</text>
|
||||
<text x='384' y='116'>r</text>
|
||||
<text x='392' y='116'>g</text>
|
||||
<text x='400' y='116'>o</text>
|
||||
<text x='408' y='116'>n</text>
|
||||
<text x='416' y='116'>2</text>
|
||||
<text x='536' y='116'>p</text>
|
||||
<text x='544' y='116'>w</text>
|
||||
<text x='552' y='116'>b</text>
|
||||
<text x='560' y='116'>o</text>
|
||||
<text x='568' y='116'>x</text>
|
||||
<text x='648' y='116'>N</text>
|
||||
<text x='656' y='116'>o</text>
|
||||
<text x='664' y='116'>t</text>
|
||||
<text x='672' y='116'>a</text>
|
||||
<text x='688' y='116'>e</text>
|
||||
<text x='696' y='116'>n</text>
|
||||
<text x='704' y='116'>c</text>
|
||||
<text x='712' y='116'>r</text>
|
||||
<text x='720' y='116'>i</text>
|
||||
<text x='728' y='116'>p</text>
|
||||
<text x='736' y='116'>t</text>
|
||||
<text x='744' y='116'>a</text>
|
||||
<text x='752' y='116'>d</text>
|
||||
<text x='760' y='116'>a</text>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.6 KiB |
Reference in a new issue