Objavljen je Ad Nihilum 0.4.3 — minimalistička usluga za razmjenu šifriranih poruka prema principu 'pročitao — spalio', prvenstveno namijenjena self-hostingu.
Poslužitelj služi samo kao gluhi spremnik. Šifriranje i dešifriranje odvijaju se isključivo na strani klijenta, u pregledniku (putem AES-GCM).
Karakteristike
- lokalno šifriranje i dešifriranje, server nikada ne vidi ključ;
- podrška za dodatni sloj šifriranja lozinkom, o kojoj (1) poslužitelj ne može saznati, (2) ne može se saznati prema prenesenoj vezi;
- projekt sadrži oko 2200 redaka poslužiteljskog koda u C-u i 600 redaka klijentskog koda u JS-u, što olakšava reviziju;
- Ad Nihilum ovisi samo o libmicrohttpd. Za generiranje QR kodova isporučena je modificirana verzija QRCode.js;
- priložena je uputa za brzo postavljanje lokalne usluge bez vanjske IP adrese;
- Ad Nihilum radi i na Androidu, priložen je odgovarajući skript za izgradnju u Termuxu;
- jednoprocessni i sinkroni poslužitelj.
Promjene
Opsežan redizajn
- Stranice za slanje i primanje poruka su odvojene, odgovarajući klijentski kod.
- Dizajn je uvelike promijenjen i prilagođen u skladu s povratnim informacijama korisnika.
- Jednostavni i lokalni klijenti:
- klijentske stranice mogu se sačuvati lokalno i koristiti iz file://.
Politike preglednika
- implementiran je CSP za borbu protiv XSS;
- poslužitelj šalje HSTS.
Ostale izmjene
- projekt je preimenovan iz Epha-ots;
- kupljena je domena adnihilum.net;
- TLS se osigurava putem Let’s Encrypt, to treba imati na umu (nema novca);
- olakšana je obrada datoteka;
- prelazak na fat-pointere;
- ispravljene su manje greške;
- auto-jsminify i izgradnja klijentskih datoteka prilikom izgradnje putem CMake-a.
Pregled protokola
Generirati tri nasumične vrijednosti: ključ K, vektor inicijalizacije N i sol S. K — 256 bita, N — 96 bita, S — 128 bita.
Isplati ID iz K i S uz pomoć HKDF temeljenog na SHA-256.
Formirati niz dodatnih autentificiranih podataka aad — to je samo niz oblika: id=ID
Ako je korisnik postavio lozinku:
- izlaziti Pk iz lozinke i S uz pomoć PBKDF2, SHA-256, 800000 iteracija;
- ista sol koristi se za sve;
- šifrirati podatke pomoću AES-GCM, koristeći ključ Pk, IV/nonce N i poslati aad.
Dodati dvo-bajtni tag već šifriranim podacima ako je lozinka bila, ili izvornih podacima ako lozinke nije bilo.
Prvi bajt ima vrijednost: pokazuje jesu li podaci šifrirani lozinkom:
- 0x73 — podaci su šifrirani lozinkom;
- 0x13 — podaci nisu šifrirani lozinkom.
Drugi bajt — stalna vrijednost 0x37.
Ponovno šifrirajte rezultat pomoću AES-GCM, koristeći isti iv = N i isti aad. To daje konačni šifrovan tekst ct.
Spojite bajtove u string: blob = N .. S .. ct
Pošaljite blob na server zajedno s ID. Server vraća blob prema tome ID i ne može ga zamijeniti: klijent prvo provjerava ID s korištenjem N i K još prije dešifriranja, a zatim — putem aad.
Klijent čuva K. K nikada se ne šalje na server. Pk također se ne šalje; sve što je vezano uz lozinku se briše iz memorije.
Klijent formira vezu: origin/#ID/K
Ovdje ID i K — stringovi u formatu base64url.
Kada primatelj otvori vezu:
- pregledač odbacuje sve što počinje s #; to se zove location.hash;
- klijentska aplikacija se učitava sa servera;
- smatram da je to glavna rupa: zapravo se ponovo suočavamo s problemom da je 'TLS probojan';
- međutim, ništa ne sprječava da klijent bude offline;
- u idealnom slučaju trebao bi biti odvojeni standalone-klijent.
Klijentski JavaScript provjerava location.hash, i ako ima ID i K, preuzima podatke s poslužitelja.
Zatim ih provjerava, dešifrira i, ako je potrebno, traži lozinku i dešifrira ponovno.
Licenca
Projekt se distribuira pod GPLv3.
Izvor: linux.org.ru
