Izlaista Ad Nihilum 0.4.3 — minimālistisks pakalpojums, kas paredzēts šifrētu ziņojumu apmaiņai principā "izlasīju — sadedzināju", fokusējoties galvenokārt uz pašizvietošanu.
Serveris darbojas tikai kā aklais krātuve. Šifrēšana un atšifrēšana notiek tikai klienta pusē, pārlūkprogrammā (izmantojot AES-GCM).
Īpašības
- lokālā šifrēšana un atšifrēšana, servera nekad neredz atslēgu;
- papildu slāņa šifrēšanas atbalsts ar paroli, par kuru (1) serveris nevar zināt, (2) to nevar uzzināt no pārsūtītās saites;
- projekts satur ap 2200 rindām servera kods C un 600 rindām klienta kods JS, kas atvieglo auditu;
- Ad Nihilum paļaujas tikai uz libmicrohttpd. Lejupielādes QR koda ģenerēšanai ir nodrošināta modificēta versija QRCode.js;
- iekļauta instrukcija ātrai lokālā pakalpojuma palaišanai bez ārējā IP;
- Ad Nihilum darbojas arī Android, pievienots atbilstošs skripts būvēšanai Termux;
- viena pavediena un synchro serveris.
Izmaiņas
Masveida pārveide
- Ir sadalītas ziņojumu sūtīšanas un saņemšanas lapas, atbilstošais klienta kods.
- Dizains kopumā ir ievērojami mainīts un pielāgots, ņemot vērā loru vēlmēm.
- "Vienkāršie" un lokālie klienti:
- klienta lapas var saglabāt lokāli un izmantot no file://.
Pārlūkprogrammu politikas
- ievieš CSP, lai cīnītos ar XSS;
- serveris sūta HSTS.
Citi izmaiņas
- projekts pārdēvēts no Epha-ots;
- nopirkts domēns adnihilum.net;
- TLS nodrošina Let’s Encrypt, to ir jāņem vērā (nav naudas);
- atvieglo darbs ar failiem;
- pāreja uz fat-pointeriem;
- salabotas sīkās kļūdas;
- auto-jsminify un klientu failu būvēšana, būvējot ar CMake.
Protokola pārskats
Generēt trīs nejaušas vērtības: atslēga K, inicializācijas vektors N un sāls S. K — 256 biti, N — 96 biti, S — 128 biti.
Izņemt ID no K un S izmantojot HKDF, balstoties uz SHA-256.
Izveidot papildu autentificētu datu virkni aad — tas ir vienkārši virkne formātā: id=ID
Ja lietotājs ir norādījis paroli:
- izvadīt Pk no paroles un S izmantojot PBKDF2, SHA-256, 800000 iterāciju;
- tā pati sāls tiek izmantota visam;
- šifrēt datus, izmantojot AES-GCM, izmantojot atslēgu Pk, IV/nonce N un nosūtīt aad.
Pievienot divu bajtu tagu jau šifrētiem datiem, ja parole tika izmantota vai pievienot sākotnējiem datiem, ja paroles nebija.
Pirmajam bajtam ir vērtība: tā norāda, vai dati tika šifrēti ar paroli:
- 0x73 — dati ir šifrēti ar paroli;
- 0x13 — dati nav šifrēti ar paroli.
Otrais baits — pastāvīga vērtība 0x37.
Atkal šifrēt rezultātu, izmantojot AES-GCM, izmantojot to pašu iv = N un to pašu aad. Tas dod gala šifrtekstus ct.
Sasaistīt baitus virknei: blob = N .. S .. ct
Nosūtīt blob uz serveri kopā ar ID. Servers atgriež blob pa to ID un nevar to viltot: klients vispirms pārbaudīs ID izmantojot N un K vēl pirms atšifrēšanas, un pēc tam — caur aad.
Klients glabā K. K nekad netiek nosūtīts uz serveri. Pk tāpat netiek nosūtīts; viss, kas attiecas uz paroli, tiek dzēsts no atmiņas.
Klients izveido saiti: origin/#ID/K
Šeit ID un K — virknes base64url formātā.
Kad saņēmējs atver saiti:
- pārlūkprogramma noraida visu, kas sākas ar #; to sauc par location.hash;
- klienta lietojumprogramma tiek ielādēta no servera;
- manuprāt, tā ir galvenā vāja vieta: mēs faktiski atkārtoti nonākam pie tā, ka "TLS ir caurs";
- tomēr nekas netraucē saglabāt klientu offline;
- ideālā gadījumā tam jābūt atsevišķam standalone klientam.
Klienta JavaScript pārbauda location.hash, un, ja tur ir ID un K, tas ielādē datus no servera.
Tad tas pārbauda tos, atšifrē un, ja nepieciešams, pieprasa paroli un vēlreiz atšifrē.
Licence
Projekts tiek izplatīts saskaņā ar GPLv3.
Avots: linux.org.ru
