Prezentácia Ad Nihilum 0.4.3 – minimalistickej služby na výmenu zašifrovaných správ podľa princípu „prečítal – spálil“, zameranej predovšetkým na self-hosting.
Server funguje iba ako hluché úložisko. Šifrovanie a dešifrovanie prebieha výhradne na strane klienta, v prehliadači (cez AES-GCM).
Vlastnosti
- lokálne šifrovanie a dešifrovanie, server nikdy nevidí kľúč;
- podpora dodatočnej vrstvy šifrovania heslom, o ktorej (1) server nemôže vedieť, (2) nemožno ju zistiť cez prenosový odkaz;
- projekt obsahuje približne 2200 riadkov serverového kódu v jazyku C a 600 riadkov klientského kódu v JS, čo uľahčuje audit;
- Ad Nihilum závisí iba od libmicrohttpd. Na generovanie QR kódov je dodávaná modifikovaná verzia QRCode.js;
- je priložený návod na rýchle spustenie lokálnej služby bez externého IP;
- Ad Nihilum funguje aj na Android, je priložený príslušný skript na zostavenie v Termux;
- jednozdrojový a synchronný server.
Zmeny
Rozsiahly redesign
- Stránky na odosielanie a prijímanie správ boli oddelené, príslušný klientský kód.
- Celkový dizajn bol výrazne zmenený a upravený na základe požiadaviek komunity.
- „Jednoduché“ a lokálne klienti:
- klientské stránky je možné uložiť lokálne a používať z file://.
Prehliadačové politiky
- vložené CSP na boj proti XSS;
- server posiela HSTS.
Iné zmeny
- projekt bol premenovaný z Epha-ots;
- kúpená doména adnihilum.net;
- TLS je zabezpečené pomocou Let’s Encrypt, na to treba mať na pamäti (nemáme peniaze);
- zjednodušená práca s súbormi;
- prechod na fat-pointery;
- opravené drobné chyby;
- auto-jsminify a zostavenie klientských súborov pri zostavovaní cez CMake.
Prehľad protokolu
Vygenerovať tri náhodné hodnoty: kľúč K, inicializačný vektor N a soľ S. K — 256 bitov, N — 96 bitov, S — 128 bitov.
Zobraziť ID z K a S s pomocou HKDF na základe SHA-256.
Vytvoriť reťazec dodatočných autentifikovaných údajov aad — je to jednoducho reťazec vo formáte: id=ID
Ak používateľ zadá heslo:
- vydať Pk z hesla a S s pomocou PBKDF2, SHA-256, 800000 iterácií;
- rovnaká soľ sa používa pre všetko;
- zašifrovať údaje pomocou AES-GCM, pomocou kľúča Pk, IV/nonce N a odoslať aad.
Pridať dvojbytový tag k už zašifrovaným údajom, ak bolo heslo, alebo k pôvodným údajom, ak heslo nebolo.
Prvý bajt má hodnotu: ukazuje, či boli údaje zašifrované heslom:
- 0x73 — údaje sú zašifrované heslom;
- 0x13 — údaje nie sú zašifrované heslom.
Druhý bajt — konštantná hodnota 0x37.
Znovu zašifrovať výsledok pomocou AES-GCM, s použitím toho istého iv = N a toho istého aad. To dáva konečný šifrovací text ct.
Spojiť bajty do reťazca: blob = N .. S .. ct
Odoslať blob na server spolu s ID. Server vracia blob podľa tohto ID a nemôže ho zmeniť: klient najprv overí ID s využitím N a K ešte pred dešifrovaním, a potom — cez aad.
Klient uchováva K. K nikdy nie je odoslané na server. Pk taktiež nie je odoslané; všetko, čo má súvislosť s heslom, sa vymazáva z pamäte.
Klient vytvára odkaz: origin/#ID/K
Tu ID a K — reťazce vo formáte base64url.
Keď príjemca otvorí odkaz:
- prehľadávač odmieta všetko, čo začína s #; to sa nazýva location.hash;
- klientská aplikácia sa načíta zo servera;
- podľa môjho názoru, to je hlavný problém: vlastne sa opäť dostávame k tomu, že "TLS je dieravý";
- avšak nič nebráni uložiť klienta offline;
- ideálne by mal byť samostatný standalone klient.
Klientsky JavaScript kontroluje location.hash, a ak tam je ID a K, načíta dáta zo servera.
Potom ich skontroluje, dešifruje a, ak je to potrebné, požaduje heslo a dešifruje znova.
Licencia
Projekt sa šíri pod GPLv3.
Zdroj: linux.org.ru
