Compare commits
7 commits
e342483f41
...
87e7ed9ffd
Author | SHA1 | Date | |
---|---|---|---|
Sofía Aritz | 87e7ed9ffd | ||
Sofía Aritz | b7c712a633 | ||
Sofía Aritz | ba33e0e00c | ||
Sofía Aritz | ba9b759e53 | ||
Sofía Aritz | 2b63e27bfa | ||
Sofía Aritz | 49ad1fe76e | ||
Sofía Aritz | f5426b1ff0 |
19
.eleventy.js
19
.eleventy.js
|
@ -1,6 +1,25 @@
|
|||
const { DateTime } = require("luxon")
|
||||
const timeToRead = require("eleventy-plugin-time-to-read")
|
||||
|
||||
module.exports = function(eleventyConfig) {
|
||||
eleventyConfig.addPassthroughCopy("css")
|
||||
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 {
|
||||
passthroughFileCopy: true
|
||||
}
|
||||
|
|
1
.eleventyignore
Normal file
1
.eleventyignore
Normal file
|
@ -0,0 +1 @@
|
|||
README.md
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -23,5 +23,5 @@ dist-ssr
|
|||
*.sln
|
||||
*.sw?
|
||||
|
||||
_old
|
||||
_site
|
||||
_scripts
|
||||
|
|
18
_includes/post.njk
Normal file
18
_includes/post.njk
Normal 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 }}
|
|
@ -26,7 +26,7 @@
|
|||
<div>
|
||||
<i>mi cabeza</i>
|
||||
<ul>
|
||||
<!-- <li><a href="/weblog">weblog</a></li> -->
|
||||
<li><a href="/weblog">weblog</a></li>
|
||||
<li><a href="/recommendations">recomendaciones</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
31
contact.md
31
contact.md
|
@ -14,18 +14,9 @@ Todavía no tengo una gran presencia digital, pero la poquita que tengo aquí se
|
|||
|
||||
### redes sociales
|
||||
|
||||
<blockquote>
|
||||
<details>
|
||||
<summary>
|
||||
<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>
|
||||
- Forgejo: [sofia@git.sofiaritz.com](https://git.sofiaritz.com/sofia)
|
||||
- Codeberg: [sofiaritz@codeberg.org](https://codeberg.org/sofiaritz)
|
||||
- Fediverse (Mastodon): [@me@sofiaritz.com (@sofiaritz@hachyderm.io)](https://hachyderm.io/@sofiaritz)
|
||||
|
||||
### cifrado y firmado
|
||||
|
||||
|
@ -58,11 +49,9 @@ contacto directo
|
|||
|
||||
redes sociales
|
||||
|
||||
Nota: Aquí se encuentra mi versión desenfadada, tal vez sea algo que quieras tener en cuenta.
|
||||
|
||||
Fediverse (Mastodon): @me@sofiaritz.com (@sofiaritz@hachyderm.io)
|
||||
Codeberg: sofiaritz
|
||||
Gitea: sofia@git.sofiaritz.com
|
||||
Forgejo: sofia@git.sofiaritz.com
|
||||
Codeberg: sofiaritz@codeberg.org
|
||||
Fediverse (Mastodon): @me@sofiaritz.com (@sofiaritz@hachyderm.io)
|
||||
|
||||
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.
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iHUEARYKAB0WIQRLsWp0XeHHdlzzh4iQtRFuNUKyjwUCY/yLxAAKCRCQtRFuNUKy
|
||||
j2b1AQDmMW8gbUljFqg3xExh5zB3/W/ZmD3kxmFRDHKcljdVVgEAmE2lIwY2VowR
|
||||
ZMyjTshgFNng6hnj+inJl4qlTHmXHQg=
|
||||
=7k3p
|
||||
iHUEARYKAB0WIQRLsWp0XeHHdlzzh4iQtRFuNUKyjwUCZA22YwAKCRCQtRFuNUKy
|
||||
jxPqAP0WLIsgMpnyWORYRbDXMBABIuBIZTm46OSlxY6cS80+oQD+IOaBEcJhwoGx
|
||||
JkwkXJPGbxrKiMC+14E5Lc/rl6SlyQg=
|
||||
=qa4I
|
||||
-----END PGP SIGNATURE-----
|
||||
</pre>
|
||||
</details>
|
||||
|
|
|
@ -9,9 +9,12 @@
|
|||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "npx @11ty/eleventy --serve",
|
||||
"build": "npx @11ty/eleventy"
|
||||
"build": "npx @11ty/eleventy",
|
||||
"deploy": "cd _scripts && ./deploy.sh"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@11ty/eleventy": "^2.0.0"
|
||||
"@11ty/eleventy": "^2.0.0",
|
||||
"eleventy-plugin-time-to-read": "^1.3.0",
|
||||
"luxon": "^3.3.0"
|
||||
}
|
||||
}
|
||||
|
|
BIN
static/assets/weblog/note-taking-experimental/note-creation.png
Normal file
BIN
static/assets/weblog/note-taking-experimental/note-creation.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
static/assets/weblog/note-taking-experimental/note-list.png
Normal file
BIN
static/assets/weblog/note-taking-experimental/note-list.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
static/assets/weblog/note-taking-experimental/top-buttons.png
Normal file
BIN
static/assets/weblog/note-taking-experimental/top-buttons.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
12
weblog.md
Normal file
12
weblog.md
Normal 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
15
weblog/firstpost.md
Normal 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!
|
113
weblog/note-taking-experiment.md
Normal file
113
weblog/note-taking-experiment.md
Normal 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%"/>
|
||||
|
|
@ -456,6 +456,11 @@ ejs@^3.1.8:
|
|||
dependencies:
|
||||
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:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
||||
|
@ -859,7 +864,7 @@ lru-cache@^6.0.0:
|
|||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
luxon@^3.2.1:
|
||||
luxon@^3.2.1, luxon@^3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48"
|
||||
integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==
|
||||
|
|
Reference in a new issue