È stata rilasciata Ad Nihilum 0.4.3, un servizio minimalista per lo scambio di messaggi crittografati secondo il principio «ho letto – ho bruciato», rivolto principalmente al self-hosting.
Il server funge solo da deposito silenzioso. La crittografia e la decrittazione avvengono esclusivamente lato client, nel browser (tramite AES-GCM).
Caratteristiche
- crittografia e decrittografia locale, server mai vede la chiave;
- supporto per un ulteriore strato di crittografia con una password, di cui (1) il server non può venire a conoscenza, (2) non può essere dedotta dal link trasmesso;
- il progetto contiene circa 2200 righe di codice server in C e 600 righe di codice client in JS, il che semplifica l'audit;
- Ad Nihilum dipende solo da libmicrohttpd. Per la generazione di codici QR, è fornita una versione modificata di QRCode.js;
- è allegata una guida per avviare rapidamente un servizio locale senza un IP esterno;
- Ad Nihilum funziona anche su Android, è incluso uno script per la compilazione in Termux;
- server monothread e sincrono.
Modifiche
Ridefinizione su larga scala
- Le pagine di invio e ricezione dei messaggi sono state separate, insieme al relativo codice client.
- In generale, il design è stato fortemente modificato e corretto tenendo conto delle richieste della community.
- Client 'semplice' e locale:
- le pagine client possono essere salvate localmente e utilizzate da file://.
Politiche del browser
- implementato CSP per combattere gli attacchi XSS;
- il server invia HSTS.
Le date YYYY-M-DD e YYYY-MM-D non sono
- il progetto è stato rinominato da Epha-ots;
- dominio adnihilum.net acquistato;
- TLS è garantito tramite Let's Encrypt, è importante tenerne conto (non ci sono soldi);
- semplificata la gestione dei file;
- passato ai puntatori fat;
- corretti bug minori;
- auto-jsminify e costruzione dei file client durante la compilazione con CMake.
Panoramica del protocollo
Genera tre valori casuali: chiave K, vettore di inizializzazione N e sale S. K — 256 bit, N — 96 bit, S — 128 bit.
Visualizza ID da K e S utilizzando HKDF basato su SHA-256.
Genera una stringa di dati autenticati aggiuntivi aad — è semplicemente una stringa del tipo: id=ID
Se l'utente ha impostato una password:
- visualizza Pk dalla password e S utilizzando PBKDF2, SHA-256, 800000 iterazioni;
- la stessa sale viene utilizzata per tutto;
- crittografare i dati utilizzando AES-GCM, usando la chiave Pk, IV/nonce N e trasmettere aad.
Aggiungere un tag di due byte ai dati già crittografati, se era presente una password, oppure ai dati originali, se non c'era una password.
Il primo byte ha un significato: indica se i dati sono stati criptati con una password:
- 0x73 — i dati sono criptati con una password;
- 0x13 — i dati non sono criptati con una password.
Il secondo byte è un valore costante 0x37.
Cripta nuovamente il risultato utilizzando AES-GCM, usando lo stesso iv = N e lo stesso aad. Questo dà il testo cifrato finale ct.
Concatena i byte in una stringa: blob = N .. S .. ct
Invia blob al server insieme a ID. Il server restituisce blob su questo ID e non può sostituirlo: il client controlla prima ID utilizzando N e K ancora prima della decrittazione, e poi — attraverso aad.
Il client memorizza K. K non viene mai inviato al server. Pk non viene inviato; tutto ciò che è legato alla password viene rimosso dalla memoria.
Il client genera un link: origin/#ID/K
Qui ID e K — stringhe nel formato base64url.
Quando il destinatario apre il link:
- il browser scarta tutto ciò che inizia con #; questo si chiama location.hash;
- l'applicazione client viene caricata dal server;
- a mio avviso, questo è il principale punto debole: ci ritroviamo effettivamente di fronte a quello che è "TLS vulnerabile";
- tuttavia, nulla impedisce di conservare il client offline;
- idealmente dovrebbe esserci un client standalone separato.
Il JavaScript client verifica location.hash, e se c'è ID e K, carica i dati dal server.
Poi li verifica, li decripta e, se necessario, richiede la password e decripta di nuovo.
Licenza
Il progetto è distribuito sotto GPLv3.
Fonte: linux.org.ru
