Izšel je Ad Nihilum 0.4.3 — minimalistična storitev za izmenjavo šifriranih sporočil po načelu 'prebral — sežgal', ki je predvsem namenjena self-hosting.
Strežnik deluje le kot gluh skladišče. Šifriranje in dešifriranje potekata izključno na strani odjemalca, v brskalniku (prek AES-GCM).
Karakteristike
- lokalno šifriranje in dešifriranje, strežnik nikoli ne vidi ključa;
- podpora dodatni plast šifriranja s geslom, o katerem (1) strežnik ne more vedeti, (2) ni možno ugotoviti iz posredovane povezave;
- projekt vsebuje približno 2200 vrstic strežniškega kode na C in 600 vrstic odjemalskega kode na JS, kar poenostavi revizijo;
- Ad Nihilum je odvisen le od libmicrohttpd. Za generiranje QR kod je priložena spremenjena različica QRCode.js;
- priložena je navodila za hitro postavitev lokalne storitve brez zunanjega IP;
- Ad Nihilum deluje tudi na Androidu, priložen je ustrezen skript za gradnjo v Termux;
- enotne niti in sinhroni strežnik.
Wijzigingen
Obsežna prenova
- Strani za pošiljanje in prejemanje sporočil so ločene, ustrezen odjemalski koda.
- Splošno je bil dizajn močno spremenjen in prilagojen glede na želje uporabnikov.
- "Enostavni" in lokalni odjemalci:
- odjemalske strani je mogoče shraniti lokalno in jih uporabljati iz file://.
Politike brskalnika
- vključen CSP za boj proti XSS;
- strežnik pošilja HSTS.
Druge spremembe
- projekt je bil preimenovan iz Epha-ots;
- kupljena domena adnihilum.net;
- TLS je zagotovljen s pomočjo Let’s Encrypt, kar je treba upoštevati (denarja ni);
- poenostavljeno delo z datotekami;
- prehod na fat-pointerje;
- popravljene manjše napake;
- avto-jsminify in gradnja odjemalskih datotek pri gradnji prek CMake.
Pregled protokola
Generirati tri naključne vrednosti: ključ K, vektor inicijalizacije N in sol S. K — 256 bitov, N — 96 bitov, S — 128 bitov.
Povući ID iz K in S s pomočjo HKDF na osnovi SHA-256.
Oblikovati niz dodatnih avtoriziranih podatkov aad — to je preprosto niz oblike: id=ID
Če je uporabnik določil geslo:
- izpisati Pk iz gesla in S s pomočjo PBKDF2, SHA-256, 800000 iteracij;
- ista sol se uporablja za vse;
- šifrirati podatke z AES-GCM, uporabo ključa Pk, IV/nonce N in preneseni aad.
Dodati dvojbajtni oznako že šifriranim podatkom, če je bilo geslo, ali k izvorni podatki, če gesla ni bilo.
Prvi bajt ima vrednost: prikazuje, ali so bili podatki šifrirani z geslom:
- 0x73 — data je šifrirana s lozinkom;
- 0x13 — data nisu šifrirana s lozinkom.
Drugi bajt je stalna vrednost 0x37.
Ponovno šifrirajte rezultat koristeći AES-GCM, koristeći isti iv = N i istu aad. To daje konačni šifrovani tekst ct.
Spojite bajtove u niz: blob = N .. S .. ct
Pošalji blob na server zajedno s ID. Server vraća blob preko ovog ID i ne može ga zameniti: klijent prvo proverava ID z uporabo N in K pre nego što ga dešifruje, a zatim — kroz aad.
Klijent čuva K. K nikada se ne šalje na server. Pk takođe se ne šalje; sve što se odnosi na lozinku se briše iz memorije.
Klijent formira link: origin/#ID/K
Tukaj ID in K — stringovi u formatu base64url.
Kada primalac otvori link:
- pretraživač odbacuje sve što počinje sa #; to se zove location.hash;
- klijentska aplikacija se učitava sa servera;
- po mom mišljenju, to je glavna rupa: zapravo se ponovo suočavamo sa time da je 'TLS svestan';
- međutim, ništa ne sprečava da se klijent čuva offline;
- idealan bi trebao biti poseban standalone klijent.
Klijentski JavaScript proverava location.hash, i ako postoji ID in K, učitava podatke sa servera.
Zatim ih proverava, dešifruje i, ako je potrebno, traži lozinku i dešifruje ponovo.
Licenca
Projekat se distribuira pod GPLv3.
Izvor: linux.org.ru
