Noutăți · Securitatea la Blackbear
Ce nu putem citi
Blackbear este local, în primul rând. Fiecare funcție merge pe dispozitivul tău, iar implicit datele tale stau doar acolo, fără niciun server la mijloc.
Când activezi sincronizarea în cloud, serverele noastre încep să-ți transporte datele între dispozitivele tale și oamenii tăi. Seria aceasta explică ce înseamnă asta pentru confidențialitatea ta. Partea 1 e despre criptare: ce pleacă de pe dispozitivul tău și de ce nu putem citi. Partea 2 e un registru onest al metadatelor pe care serverele noastre chiar le păstrează. Partea 3 e despre distribuire și colaborare.
Tot ce urmează descrie cod lansat, nu intenții. Acolo unde numim un algoritm sau un număr, e cel care rulează azi în producție.
Criptarea are loc pe dispozitivul tău
Fiecare modificare pe care o sincronizezi e criptată înainte să atingă rețeaua. Notițe, documente, sarcini, evenimente, intrări de jurnal, foi de calcul, pânze, audio, istoric al versiunilor. Fiecare e sigilată cu XChaCha20-Poly1305, un cifru autentificat, cu o cheie care nu părăsește niciodată dispozitivul tău neprotejată. Serverele noastre primesc text cifrat și stochează text cifrat.
Imaginile și fișierele audio sunt tratate la fel: criptate pe dispozitivul tău și încărcate ca blocuri de date opace.
Codul care face toate acestea e o singură implementare în Rust, construită pe ecosistemul RustCrypto și compilată în WebAssembly. Aplicația și CLI-ul Blackbear o folosesc pe aceeași, byte cu byte, iar noi o testăm cu date de test comune mai multor limbaje, ca nicio a doua implementare să nu se poată îndepărta pe tăcute.
Ce protejează asta și ce nu
Criptarea e o unealtă anume, nu un câmp de forță. Înainte de detalii, limitele.
Acest design te protejează de:
- O breșă pasivă în serverele sau baza noastră de date — date stocate furate. Ce se scurge e text cifrat și chei împachetate.
- Noi înșine. Sistemele noastre de producție nu primesc niciodată cheile tale de conținut sau text în clar, așa că o cerere legală pentru conținutul tău obține ce deținem cu adevărat: metadate (Partea 2) și blocuri sigilate.
Nu te protejează de:
- Un dispozitiv compromis, furat sau deblocat. Dispozitivul îți ține cheile; securitatea lui e temelia pe care stă tot restul.
- Oricine are fraza ta de acces sau cele douăsprezece cuvinte de recuperare.
- Ce fac destinatarii autorizați cu ce le distribui. Distribuirea e încredere în oameni, nu doar matematică.
- Metadatele traficului: cine, când, cât. Acesta e întregul subiect al Părții 2.
- Aplicația însăși. Pe web, aplicația vine de pe serverele noastre la fiecare încărcare; pe desktop, prin versiuni semnate. Nicio schemă de criptare nu supraviețuiește unei aplicații rău-intenționate, oricine ar livra-o.
- Momentele în care alegi să trimiți date în clar: când îi ceri lui Pax să folosească un model în cloud, când conectezi un calendar extern, când exporti fișiere, când trimiți o invitație pe e-mail. Acestea ajung intenționat la cine ai ales, sub regulile acelora, nu sub criptarea noastră.
Ierarhia cheilor
Fraza ta de acces nu părăsește niciodată dispozitivul. Totul pornește de la ea:
- Fraza de acces trece prin Argon2id, o funcție de derivare a cheilor care cere multă memorie, reglată la 64 MiB de memorie, trei treceri și patru benzi. Rezultatul e cheia de cont.
- Cheia de cont împachetează cheia seifului: o cheie aleatorie de 256 de biți, generată pe dispozitivul tău. Cheia seifului e cea care îți criptează de fapt datele.
- Serverele noastre stochează cheia seifului împachetată, sarea și parametrii de reglaj. Cheia împachetată e ea însăși text cifrat. Fără fraza ta de acces, e zgomot.
Serverul stochează doar copiile împachetate: text cifrat care protejează text cifrat.
De ce acest ocol? Îți permite să-ți schimbi fraza de acces fără să recriptezi o viață întreagă și permite existența recuperării fără să slăbească ușa de la intrare.
O precauție care merită scrisă negru pe alb: Argon2id face ghicitul scump; nu poate face o frază de acces slabă să fie puternică. Cheia seifului împachetată e exact atât de puternică pe cât e fraza care o împachetează. Alege una lungă.
Recuperarea înseamnă douăsprezece cuvinte
Când configurezi sincronizarea, Blackbear îți dă o frază de recuperare: douăsprezece cuvinte (BIP39) care codifică 128 de biți de entropie. Din ele se derivează o cheie independentă care împachetează a doua oară cheia seifului.
Ți-ai pierdut fraza de acces? Cele douăsprezece cuvinte te aduc înapoi. Le-ai pierdut pe amândouă? Datele tale sincronizate s-au dus. Nu le putem reseta și niciun tichet de suport nu ne poate convinge s-o facem, pentru că la noi nu există nimic de resetat. Nu e o lipsă a suportului nostru. E designul care ține.
Adăugarea unui dispozitiv
Pe un dispozitiv nou, introduci fraza de acces. Din ea se derivează local cheia de cont, care despachetează cheia seifului din copia împachetată păstrată pe serverul nostru. Serverul nu vede niciodată fraza de acces și nu vede niciodată rezultatul.
Un dispozitiv existent și deblocat poate preda și el cheia direct. Sigilează cheia seifului pentru cheia publică X25519 a noului dispozitiv și o lasă într-un loc de transfer care se autodistruge după cinci minute, folosit sau nu. O limită onestă aici: dispozitivul existent află cheia publică a celui nou prin contul tău conectat, așa că această cale asistată are încredere că serverul nostru transmite cheia potrivită pentru dispozitivul ales de tine. Calea cu fraza de acces nu cere o astfel de încredere.
Pentru că exact acest vocabular l-ar împrumuta cineva care face phishing, o regulă care merită scrisă negru pe alb: nu-ți vom cere niciodată fraza de acces sau cuvintele de recuperare și nu-ți vom cere niciodată să aprobi un transfer de dispozitiv. Aceste solicitări apar doar într-o aplicație pe care ai deschis-o tu. Oricine altcineva le cere e un atac.
Mesajele
Mesageria folosește chei proprii, separate de sincronizare. Fiecare cont are o identitate de mesagerie X25519, iar fiecare mesaj își derivează o cheie unică dintr-o sare nouă, proprie mesajului, prin HKDF-SHA256. Mesajele călătoresc ca plicuri sigilate. Serverul le transmite mai departe; nu le poate deschide. Partea 2 arată ce dezvăluie exteriorul plicului.
O notă de design, spusă direct: cheile unice pentru fiecare mesaj nu sunt designul cu clichet rotativ pe care îl folosesc unele aplicații de mesagerie. Dacă cheia de mesagerie de lungă durată a unui dispozitiv ar fi vreodată compromisă, mesajele sigilate pentru ea ar fi în pericol. Cheile per mesaj limitează pagubele; nu sunt confidențialitate persistentă (forward secrecy) și preferăm să știi diferența.
Istoric fără amprente de conținut
Istoricul versiunilor se sincronizează ca instantanee criptate, cu ID-uri valabile doar în seiful tău. Dacă tu și un străin salvați un fișier identic, serverul vede două ID-uri fără legătură: conținuturile identice nu pot fi potrivite între conturi. Mărimea și momentul rămân vizibile, ca la tot traficul de sincronizare. Acestea sunt metadate, iar subiectul îi aparține Părții 2.
Dovadă fără dezvăluire
Operațiunile distructive asupra contului cer o dovadă a seifului: o semnătură de la o cheie Ed25519 derivată din cheia seifului. Dovedești că deții seiful fără ca seiful să călătorească vreodată. Iar când cheile și-au făcut treaba în memorie, sunt șterse cu zerouri.
Nimic din toate astea nu e exotic. XChaCha20-Poly1305, Argon2id, X25519, Ed25519, HKDF-SHA256: primitive standard, plictisitoare, verificate intens. Partea interesantă e disciplina de a le aplica peste tot și de a spune cu voce tare ce nu acoperă. Despre această disciplină e restul seriei.
Lecturi suplimentare
- Local-first software — eseul Ink & Switch din spatele filozofiei
- RFC 9106 — specificația Argon2
- XChaCha20-Poly1305 — proiectul de specificație IETF
- RFC 7748 — curbele eliptice din spatele X25519
- RFC 8032 — semnăturile Ed25519
- The Password Hashing Competition — unde a câștigat Argon2
Securitatea la Blackbear
- 1. Ce nu putem citi (ești aici)
- 2. Ce pot vedea serverele noastre
- 3. Cum rămâne distribuirea sigilată