Compare commits

...

7 commits

15 changed files with 201 additions and 26 deletions

View file

@ -1,6 +1,25 @@
const { DateTime } = require("luxon")
const timeToRead = require("eleventy-plugin-time-to-read")
module.exports = function(eleventyConfig) { module.exports = function(eleventyConfig) {
eleventyConfig.addPassthroughCopy("css") eleventyConfig.addPassthroughCopy("css")
eleventyConfig.addPassthroughCopy({ "static": "/" }) eleventyConfig.addPassthroughCopy({ "static": "/" })
eleventyConfig.addPlugin(timeToRead, {
language: "es",
style: "long",
hours: "auto",
minutes: true,
})
eleventyConfig.addFilter("readableDate", dateObj => {
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).setLocale("es-ES").toFormat("dd LLL yyyy");
})
// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-date-string
eleventyConfig.addFilter('htmlDateString', dateObj => {
return DateTime.fromJSDate(dateObj, {zone: 'utc'}).toFormat('yyyy-LL-dd');
})
return { return {
passthroughFileCopy: true passthroughFileCopy: true
} }

1
.eleventyignore Normal file
View file

@ -0,0 +1 @@
README.md

2
.gitignore vendored
View file

@ -23,5 +23,5 @@ dist-ssr
*.sln *.sln
*.sw? *.sw?
_old
_site _site
_scripts

18
_includes/post.njk Normal file
View file

@ -0,0 +1,18 @@
---
layout: simple_page.njk
---
<h1>{{ title }}</h1>
{% if date %}
<time datetime="{{ date | htmlDateString }}">{{ date | readableDate }}</time> |
{% endif %}
{% if tags %}
{% for tag in tags %}
<span>{{ tag }} {% if loop.last == false %}·{% endif %}</span>
{% endfor %}
|
{% endif %}
{{ content | timeToRead }}
{{ content | safe }}

View file

@ -26,7 +26,7 @@
<div> <div>
<i>mi cabeza</i> <i>mi cabeza</i>
<ul> <ul>
<!-- <li><a href="/weblog">weblog</a></li> --> <li><a href="/weblog">weblog</a></li>
<li><a href="/recommendations">recomendaciones</a></li> <li><a href="/recommendations">recomendaciones</a></li>
</ul> </ul>
</div> </div>

View file

@ -14,18 +14,9 @@ Todavía no tengo una gran presencia digital, pero la poquita que tengo aquí se
### redes sociales ### redes sociales
<blockquote> - Forgejo: [sofia@git.sofiaritz.com](https://git.sofiaritz.com/sofia)
<details> - Codeberg: [sofiaritz@codeberg.org](https://codeberg.org/sofiaritz)
<summary> - Fediverse (Mastodon): [@me@sofiaritz.com (@sofiaritz@hachyderm.io)](https://hachyderm.io/@sofiaritz)
<b>Nota:</b> Aquí se encuentra <i>mi versión desenfadada</i>, tal vez sea algo que quieras tener en cuenta.
</summary>
<ul>
<li>Fediverse (Mastodon): <a rel="me" href="https://hachyderm.io/@sofiaritz">@me@sofiaritz.com (@sofiaritz@hachyderm.io)</a></li>
<li>Forgejo: <a href="https://git.sofiaritz.com/sofia">sofia@git.sofiaritz.com</a></li>
<li>Codeberg: <a href="https://codeberg.org/sofiaritz">sofiaritz</a></li>
</ul>
</details>
</blockquote>
### cifrado y firmado ### cifrado y firmado
@ -58,11 +49,9 @@ contacto directo
redes sociales redes sociales
Nota: Aquí se encuentra mi versión desenfadada, tal vez sea algo que quieras tener en cuenta. Forgejo: sofia@git.sofiaritz.com
Codeberg: sofiaritz@codeberg.org
Fediverse (Mastodon): @me@sofiaritz.com (@sofiaritz@hachyderm.io) Fediverse (Mastodon): @me@sofiaritz.com (@sofiaritz@hachyderm.io)
Codeberg: sofiaritz
Gitea: sofia@git.sofiaritz.com
cifrado y firmado cifrado y firmado
@ -76,10 +65,10 @@ Puedes encontrar mi canary en /canary.txt. Este es un documento actualizado con
Si en algún momento este documento se encuentra desactualizado o desaparece, probablemente haya ocurrido algo malo. Si en algún momento este documento se encuentra desactualizado o desaparece, probablemente haya ocurrido algo malo.
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iHUEARYKAB0WIQRLsWp0XeHHdlzzh4iQtRFuNUKyjwUCY/yLxAAKCRCQtRFuNUKy iHUEARYKAB0WIQRLsWp0XeHHdlzzh4iQtRFuNUKyjwUCZA22YwAKCRCQtRFuNUKy
j2b1AQDmMW8gbUljFqg3xExh5zB3/W/ZmD3kxmFRDHKcljdVVgEAmE2lIwY2VowR jxPqAP0WLIsgMpnyWORYRbDXMBABIuBIZTm46OSlxY6cS80+oQD+IOaBEcJhwoGx
ZMyjTshgFNng6hnj+inJl4qlTHmXHQg= JkwkXJPGbxrKiMC+14E5Lc/rl6SlyQg=
=7k3p =qa4I
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----
</pre> </pre>
</details> </details>

View file

@ -9,9 +9,12 @@
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "npx @11ty/eleventy --serve", "serve": "npx @11ty/eleventy --serve",
"build": "npx @11ty/eleventy" "build": "npx @11ty/eleventy",
"deploy": "cd _scripts && ./deploy.sh"
}, },
"devDependencies": { "devDependencies": {
"@11ty/eleventy": "^2.0.0" "@11ty/eleventy": "^2.0.0",
"eleventy-plugin-time-to-read": "^1.3.0",
"luxon": "^3.3.0"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

12
weblog.md Normal file
View file

@ -0,0 +1,12 @@
---
layout: simple_page.njk
tags: meta
title: weblog
---
# weblog
Aquí iré hablando sobre ideas, experiencias y demás cosas que podrían ser relevantes!
### 2023
- [Note Taking. Notas encriptadas](/weblog/note-taking-experiment) Un programa experimental para encriptar notas.
- [Primer post](/weblog/firstpost) El nacimiento de mi weblog! :)

15
weblog/firstpost.md Normal file
View file

@ -0,0 +1,15 @@
---
layout: post.njk
title: Primer post
tags:
- meta
date: 2023-03-12
---
Este es el primer post del weblog! Aquí iré compartiendo ideas, ocurrencias y experiencias a medida que me mueva por
los mundos de Internet y la programación.
Ahora mismo este weblog está parcialmente incompleto, pero dentro de poco añadiré las cosas que faltan para que esté
completamente a punto ([RSS](https://es.wikipedia.org/wiki/RSS), etiquetas, comentarios, etc).
Cualquier sugerencia o idea para este weblog podéis [enviármela](/contact) sin problema!

View file

@ -0,0 +1,113 @@
---
layout: post.njk
title: Note Taking. Notas encriptadas
tags:
- rust
- experimentos
- note taking
date: 2023-03-12
---
## motivación
Un día me di cuenta de 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, etc.
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 expuestas 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).
## idea
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 tener 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.
## 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
<img alt="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." src="/assets/weblog/note-taking-experimental/password-prompt.png" width="85%"/>
<img alt="Captura de pantalla donde se muestran los botones 'want to add one note?' y 'settings'" src="/assets/weblog/note-taking-experimental/top-buttons.png" width="85%"/>
<img alt="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'" src="/assets/weblog/note-taking-experimental/note-list.png" width="85%"/>
<img alt="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'" src="/assets/weblog/note-taking-experimental/note-creation.png" width="85%"/>

View file

@ -456,6 +456,11 @@ ejs@^3.1.8:
dependencies: dependencies:
jake "^10.8.5" jake "^10.8.5"
eleventy-plugin-time-to-read@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eleventy-plugin-time-to-read/-/eleventy-plugin-time-to-read-1.3.0.tgz#17701132491b522fa013fcc103a24eafe3b56082"
integrity sha512-EefxYZJviQbClwoQ+pXW0YsVoi3gzXJ3prJoOLO1g3n5dM17KyZh81/yyq5Inrdc2pxBz3CXsyo21kk43gK/Gg==
encodeurl@~1.0.2: encodeurl@~1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@ -859,7 +864,7 @@ lru-cache@^6.0.0:
dependencies: dependencies:
yallist "^4.0.0" yallist "^4.0.0"
luxon@^3.2.1: luxon@^3.2.1, luxon@^3.3.0:
version "3.3.0" version "3.3.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48" resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48"
integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg== integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==