Se lanzó Ad Nihilum 0.4.3, un servicio minimalista para intercambiar mensajes cifrados bajo el principio de 'leí - quemé', enfocado principalmente en el autoalojamiento.
El servidor actúa solo como un almacenamiento ciego. El cifrado y descifrado ocurren exclusivamente del lado del cliente, en el navegador (a través de AES-GCM).
Características
- cifrado y descifrado local, servidor nunca ve la clave;
- soporte para una capa adicional de cifrado por contraseña, que (1) el servidor no puede conocer, (2) no se puede determinar a través del enlace transmitido;
- el proyecto contiene alrededor de 2200 líneas de código del servidor en C y 600 líneas de código del cliente en JS, lo que facilita la auditoría;
- Ad Nihilum solo depende de libmicrohttpd. Se proporciona una versión modificada de QRCode.js para la generación de códigos QR;
- se incluye una guía para levantar rápidamente un servicio local sin una IP externa;
- Ad Nihilum funciona en Android, se adjunta un script correspondiente para compilar en Termux;
- servidor de un solo hilo y sincrónico.
Cambios
Rediseño a gran escala
- Se separaron las páginas de envío y recepción de mensajes, el código del cliente correspondiente.
- En general, el diseño fue muy modificado y ajustado teniendo en cuenta los deseos de los lorchanos
- Clientes 'simples' y locales:
- las páginas del cliente se pueden guardar localmente y usar desde file://.
Políticas del navegador
- se implementó CSP para combatir XSS;
- el servidor envía HSTS.
Las fechas YYYY-M-DD y YYYY-MM-D ya no se interpretan
- el proyecto fue renombrado de Epha-ots;
- se compró el dominio adnihilum.net;
- TLS se garantiza mediante Let’s Encrypt, es importante tenerlo en cuenta (no hay dinero);
- se simplificó el manejo de archivos;
- transición a punteros-fat;
- se corrigieron errores menores;
- auto-jsminify y construcción de archivos del cliente al compilar a través de CMake.
Revisión del protocolo
Generar tres valores aleatorios: la clave K, el vector de inicialización N y la sal S. K — 256 bits, N — 96 bits, S — 128 bits.
Mostrar ID de K y S usando HKDF basado en SHA-256.
Formar una cadena de datos adicionales autenticados aad — es simplemente una cadena del tipo: id=ID
Si el usuario estableció una contraseña:
- salida Pk de la contraseña y S usando PBKDF2, SHA-256, 800000 iteraciones;
- la misma sal se utiliza para todo;
- cifrar datos usando AES-GCM, utilizando la clave Pk, IV/nonce N y transmitir aad.
Agregar una etiqueta de dos bytes a los datos ya cifrados, si hubo contraseña, o a los datos originales si no hubo contraseña.
El primer byte tiene el valor: indica si los datos fueron cifrados por contraseña:
- 0x73 — los datos están cifrados por una contraseña;
- 0x13 — los datos no están cifrados por una contraseña.
El segundo byte es un valor constante 0x37.
Volver a cifrar el resultado con AES-GCM, utilizando el mismo iv = N y el mismo aad. Esto proporciona el texto cifrado final ct.
Combinar bytes en una cadena: blob = N .. S .. ct
Enviar blob al servidor junto con ID. El servidor devuelve blob a través de esto ID y no puede ser sustituido: el cliente primero comprobará ID utilizando N y K incluso antes de la descifrado, y luego a través de aad.
El cliente almacena K. K nunca se envía al servidor. Pk también no se envía; todo lo relacionado con la contraseña se elimina de la memoria.
El cliente forma un enlace: origin/#ID/K
Aquí ID y K — cadenas en formato base64url.
Cuando el destinatario abre el enlace:
- el navegador descarta todo lo que comienza con #; esto se llama location.hash;
- la aplicación cliente se carga desde el servidor;
- en mi opinión, esta es la principal brecha: en realidad, estamos volviendo a encontrar que “TLS es débil”;
- sin embargo, nada impide que el cliente se almacene fuera de línea;
- idealmente debería haber un cliente independiente.
El JavaScript del cliente verifica location.hash, y si hay ID y K, carga los datos desde el servidor.
Luego los verifica, los descifra y, si es necesario, solicita la contraseña y los descifra una vez más.
Licencia
El proyecto se distribuye bajo GPLv3.
Fuente: linux.org.ru
