Proběhl vydání Ad Nihilum 0.4.3 — minimalistické služby pro výměnu zašifrovaných zpráv podle principu 'přečetl — spálil', zaměřené především na self-hosting.
Server funguje pouze jako hluchý sklad. Šifrování a dešifrování se provádí výhradně na straně klienta, v prohlížeči (pomocí AES-GCM).
Vlastnosti
- lokální šifrování a dešifrování, server nikdy nevidí klíč;
- podpora dalšího vrstvy šifrování heslem, o kterém (1) server nemůže vědět, (2) nelze zjistit podle přenášeného odkazu;
- projekt obsahuje přibližně 2200 řádků serverového kódu v C a 600 řádků klientského kódu v JS, což usnadňuje audit;
- Ad Nihilum závisí pouze na libmicrohttpd. Pro generování QR kódů je dodávána modifikovaná verze QRCode.js;
- je přiložen návod k rychlému spuštění místní služby bez externího IP;
- Ad Nihilum funguje i na Androidu, přiložený je příslušný skript pro sestavení v Termux;
- jedno-vláknový a synchronní server.
Změny
Široké redesignování
- Byly odděleny stránky pro odesílání a přijímání zpráv, odpovídající klientský kód.
- Celkově byl design výrazně změněn a upraven s ohledem na přání lorců.
- „Jednoduché“ a lokální klienty:
- klientské stránky lze uložit lokálně a používat z file://.
Politiky prohlížeče
- implementováno CSP na ochranu proti XSS;
- server posílá HSTS.
Další změny
- projekt byl přejmenován z Epha-ots;
- zakoupen domén adnihilum.net;
- TLS zajištěno pomocí Let’s Encrypt, to je dobré mít na paměti (není na to rozpočet);
- zjednodušena práce se soubory;
- přechod na fat-pointery;
- opraveny drobné chyby;
- auto-jsminify a sestavení klientských souborů při sestavení prostřednictvím CMake.
Přehled protokolu
Vygenerovat tři náhodné hodnoty: klíč K, inicializační vektor N a sůl S. K — 256 bitů, N — 96 bitů, S — 128 bitů.
Vypsat ID z K a S pomocí HKDF založeného na SHA-256.
Vytvořit řetězec dalších autentizovaných dat aad — to je prostě řetězec ve formátu: id=ID
Pokud uživatel zadá heslo:
- vypsat Pk z hesla a S s pomocí PBKDF2, SHA-256, 800000 iterací;
- stejná sůl se používá pro všechno;
- zašifrovat data pomocí AES-GCM, s použitím klíče Pk, IV/nonce N a předat aad.
Přidat dvoubajtový tag k již zašifrovaným datům, pokud bylo heslo, nebo k původním datům, pokud heslo nebylo.
První bajt má význam: ukazuje, zda byla data zašifrována heslem:
- 0x73 — data jsou zašifrována heslem;
- 0x13 — data nejsou zašifrována heslem.
Druhý bajt je konstantní hodnota 0x37.
Znovu zašifrovat výsledek pomocí AES-GCM, přičemž se používá stejný iv = N a stejný aad. To dává finální šifrovaný text ct.
Spojit bajty do řetězce: blob = N .. S .. ct
Odeslat blob na server spolu s ID. Server vrátí blob podle tohoto ID a nemůže ho podvrhnout: klient nejprve zkontroluje ID s využitím N a K ještě před dešifrováním, a poté — prostřednictvím aad.
Klient uchovává K. K nikdy se neodesílá na server. Pk ani se neodesílá; všechno, co souvisí s heslem, je vymazáno z paměti.
Klient vytváří odkaz: origin/#ID/K
Zde ID a K — řetězce ve formátu base64url.
Když příjemce otevře odkaz:
- prohlížeč odmítá vše, co začíná s #; tomu se říká location.hash;
- klientská aplikace se načítá ze serveru;
- podle mého názoru je to největší slabina: vlastně se znovu dostáváme k tomu, že „TLS je děravý“;
- ale nic nebrání tomu, aby klient byl offline;
- ideálně by měl být samostatný standalone klient.
Klientský JavaScript kontroluje location.hash, a pokud tam je ID a K, načte data ze serveru.
Poté je zkontroluje, dešifruje a pokud je to nutné, požádá o heslo a znovu dešifruje.
Licence
Projekt je distribuován pod licencí GPLv3.
Zdroj: linux.org.ru
