Ad Nihilum 0.4.3 har nu slĂ€ppts â en minimalistisk tjĂ€nst för att utbyta krypterade meddelanden enligt principen "lĂ€st â brĂ€nt", som frĂ€mst Ă€r inriktad pĂ„ self-hosting.
Servern fungerar endast som en passiv lagringsplats. Kryptering och dekryptering sker uteslutande pÄ klientsidan, i webblÀsaren (via AES-GCM).
Egenskaper
- lokal kryptering och dekryptering, server ser aldrig nyckeln;
- stöd för ett extra lager av kryptering med ett lösenord, som (1) servern inte kan kÀnna till, (2) inte kan avslöjas genom den överförda lÀnken;
- projektet innehÄller cirka 2200 rader serverkod pÄ C och 600 rader klientkod pÄ JS, vilket förenklar granskningen;
- Ad Nihilum Àr endast beroende av libmicrohttpd. För att generera QR-koder levereras en modifierad version av QRCode.js;
- en snabbguide för att starta en lokal tjÀnst utan extern IP inkluderas;
- Ad Nihilum fungerar Àven pÄ Android, med ett motsvarande skript som medföljer för byggnation i Termux;
- entrÄdad och synkroniserad server.
Ăndringar
Stor omdesign
- Sidorna för att skicka och ta emot meddelanden har delats upp, med motsvarande klientkod.
- Ăverlag har designen förĂ€ndrats och justerats med hĂ€nsyn till önskemĂ„l frĂ„n anvĂ€ndarna.
- "Enkel" och lokal klient:
- klient sidor kan sparas lokalt och anvÀndas frÄn file://.
WebblÀsarpolicyer
- CSP har införts för att bekÀmpa XSS;
- servern skickar HSTS.
Ăvriga Ă€ndringar
- projektet har bytt namn frÄn Epha-ots;
- domÀnen adnihilum.net har köpts;
- TLS hanteras med Letâs Encrypt, detta Ă€r vĂ€rt att notera (ingen budget);
- arbetet med filer har förenklats;
- övergÄng till fat-pointers;
- smÄbuggar har fixats;
- auto-jsminify och bygg av klientfiler vid kompilering via CMake.
Ăversikt av protokollet
Generera tre slumpmĂ€ssiga vĂ€rden: nyckel K, initialiseringsvektor N och salt S. K â 256 bitar, N â 96 bitar, S â 128 bitar.
Skriv ut ID frÄn K och S med HKDF baserat pÄ SHA-256.
Skapa en strĂ€ng av ytterligare autentiserad data aad â det Ă€r helt enkelt en strĂ€ng av typen: id=ID
Om anvÀndaren har angett ett lösenord:
- skriv ut Pk frÄn lösenordet och S med hjÀlp av PBKDF2, SHA-256, 800000 iterationer;
- samma salt anvÀnds för allt;
- kryptera data med AES-GCM, med nyckel Pk, IV/nonce N och överföra aad.
LÀgg till en tvÄbytes-tag till redan krypterade data, om lösenordet angavs, annars till de ursprungliga data.
Den första byte har betydelse: den visar om data har krypterats med ett lösenord:
- 0x73 â data har krypterats med ett lösenord;
- 0x13 â data har inte krypterats med ett lösenord.
Den andra byte Àr ett konstant vÀrde 0x37.
Kryptera resultatet igen med AES-GCM, med samma iv = N och samma aad. Detta ger den slutliga chiffertexten ct.
Koppla ihop byte till en strÀng: blob = N .. S .. ct
Skicka blob till servern tillsammans med ID. Servern returnerar blob genom detta ID och kan inte Ă€ndra det: klienten kommer först att kontrollera ID med hjĂ€lp av N och K Ă€ven innan avkodning, och sedan â genom aad.
Klienten lagrar K. K skickas aldrig till servern. Pk skickas inte heller; allt som rör lösenordet rensas frÄn minnet.
Klienten bildar en lÀnk: origin/#ID/K
HĂ€r ID och K â strĂ€ngar i base64url-format.
NÀr mottagaren öppnar lÀnken:
- webblÀsaren slÀnger allt som börjar med #; detta kallas location.hash;
- klientapplikationen laddas frÄn servern;
- enligt min Äsikt Àr detta den största sÀkerhetsluckan: vi stöter faktiskt igen pÄ det faktum att "TLS Àr osÀkert";
- men inget hindrar att klienten lagras offline;
- idealiskt skulle det finnas en separat fristÄende klient.
Klientens JavaScript kontrollerar location.hash, och om det finns ID och K, laddar det data frÄn servern.
Sedan kontrollerar den dem, avkodar och, om det behövs, begÀr lösenord och avkodar igen.
Licens
Projektet distribueras under GPLv3.
KĂ€lla: linux.org.ru
