Cum supraviețuiește o încărcare criptată mare unei conexiuni întrerupte
O încărcare găzduită de zeci sau sute de gigaocteți durează destul cât să se strice ceva: Wi-Fi-ul trece pe alt punct de acces, un laptop intră în repaus, o filă e reîncărcată. Transferify tratează asta pe două niveluri. Cât timp pagina e deschisă, o conexiune pierdută doar pune încărcarea pe pauză. Dacă pagina însăși a dispărut, același browser poate continua încărcarea mai târziu și poate trimite doar ce lipsește.
A doua parte e mai grea decât pare, pentru că fiecare fișier e criptat în browserul tău înainte să fie încărcat. Articolul acesta explică cum funcționează amândouă și de ce continuarea unei încărcări criptate cere grijă în plus.
Cât timp pagina e deschisă: așteaptă, reîncearcă, continuă
Un fișier găzduit urcă în multe părți separate, iar fiecare parte e o cerere separată (cum funcționează încărcarea în sine). Când o cerere eșuează pentru că s-a pierdut conexiunea sau a expirat timpul de așteptare, e încercată din nou:
- Prima reîncercare așteaptă cel mult o jumătate de secundă, iar limita fiecărei pauze următoare se dublează, până la 30 de secunde.
- Fiecare pauză e aleasă la întâmplare din jumătatea de sus a limitei ei, ca multe părți care au eșuat împreună să nu reîncerce toate în aceeași clipă.
- O cerere continuă să încerce până la zece minute de eșecuri înainte ca încărcarea să se oprească.
- Cât timp browserul tău raportează că e offline, încărcarea așteaptă rețeaua în loc să consume aceste zece minute, oricât ar dura întreruperea.
- O parte care nu trimite nimic timp de două minute e tratată ca o conexiune pierdută și e încercată din nou.
- Fiecare reîncercare a unei părți folosește o adresă de încărcare semnată nouă, așa că o adresă care a expirat cât ai fost offline e înlocuită.
O parte care eșuează nu le oprește pe celelalte. Doar o parte care și-a epuizat reîncercările încheie încărcarea, și chiar și atunci încărcarea se oprește într-un punct de unde o poți continua.
Un singur răspuns e tratat altfel. Dacă serviciul nostru răspunde că nu a reușit să pornească încărcarea în stocare a unui fișier, acea cerere e încercată de trei ori în una-două secunde, iar apoi încărcarea se oprește la fel, în loc să reîncerce minute întregi, pentru că acel răspuns nu înseamnă că ți s-a întrerupt conexiunea.
Toate acestea se aplică atunci când trimiți un transfer găzduit nou. Adăugarea de fișiere la un transfer deja trimis și încărcarea de fișiere la cererea de fișiere a altcuiva păstrează în schimb trei încercări rapide, ca o conexiune pierdută să se vadă imediat acolo.
După o reîncărcare: continuă în același browser
Înainte ca primul octet al unei încărcări să plece de pe dispozitiv, browserul tău notează ce i-ar trebui ca să o continue mai târziu. Această înregistrare e păstrată în spațiul de stocare propriu al browserului pentru acest site (IndexedDB), pe dispozitivul tău, și conține:
- cheia de criptare a transferului, stocată ca obiect-cheie propriu al browserului,
- o valoare secretă aleatorie din care sunt derivate nonce-urile fișierelor (explicată mai jos),
- ce fișiere aparțin încărcării, cu numele, dimensiunile și datele lor de modificare,
- pentru un transfer Zero-Knowledge, linkul de partajare final, cu cheia lui.
Înregistrarea rămâne pe dispozitivul tău. Valoarea secretă din ea nu ne este trimisă niciodată, și nici cheia brută: în modul implicit, serviciul nostru păstrează doar o copie a cheii, împachetată pentru o cheie din AWS KMS, iar în modul Zero-Knowledge nicio copie. E ștearsă când încărcarea se termină, când renunți la ea sau când nu mai poate fi continuată. Unui vizitator care nu pornește niciodată o încărcare găzduită nu i se scrie nimic.
Când revii, autentificat în contul care a pornit încărcarea, Transferify îți oferă să continui. Întreabă stocarea ce părți are deja din fiecare fișier, păstrează fiecare parte a cărei lungime e exact cea care trebuie și trimite restul. Fișierele terminate înainte de întrerupere sunt sărite complet.
Regăsirea fișierelor
Pentru încărcări de până la 2 GiB în total, și doar când browserul tău are liber cel puțin dublul dimensiunii încărcării, browserul păstrează și o copie a fișierelor înseși, ca să nu trebuiască să le alegi din nou. Pentru orice încărcare mai mare, alegi din nou aceleași fișiere.
Transferify potrivește fiecare fișier după nume, dimensiune și data ultimei modificări. Un fișier pe care l-ai editat între timp are o dată nouă și e refuzat, pentru că părțile deja stocate conțin vechiul conținut, iar restul trebuie să fie aceiași octeți.
De ce continuarea unei încărcări criptate cere grijă
AES-GCM, cifrul folosit de Transferify, are o regulă care nu trebuie încălcată niciodată: aceeași cheie și același nonce nu trebuie să sigileze niciodată două seturi diferite de date. Oricine ar vedea ambele rezultate ar putea afla prin ce diferă cele două și ar putea falsifica date cu acea cheie.
O încărcare continuată trebuie să se apropie intenționat de această regulă. Ca să se potrivească cu părțile pe care le are deja stocarea, părțile lipsă trebuie criptate din nou exact în octeții pe care i-ar fi avut. Asta înseamnă aceeași cheie și aceleași nonce-uri ca înainte. Două măsuri de siguranță fac asta sigur.
Nonce-uri pe care le poți reconstrui, și doar tu. La o încărcare găzduită, valoarea de pornire a nonce-urilor fiecărui fișier nu e un număr aleatoriu care se pierde când se închide pagina. E derivată cu HMAC-SHA-256 din valoarea secretă aleatorie din înregistrarea browserului tău, din poziția fișierului în selecția ta, din id-ul fișierului și din încărcarea în stocare căreia îi aparține. Browserul tău o poate deriva din nou după o reîncărcare. Serverele noastre nu pot, pentru că secretul nu părăsește niciodată dispozitivul tău.
Dovada că octeții nu s-au schimbat. Înainte ca vreo parte să plece de pe dispozitivul tău, browserul păstrează eticheta de autentificare a fiecărei bucăți din ea. Când o încărcare continuă, browserul criptează din nou fiecare bucată și compară noua etichetă cu cea păstrată înainte să trimită ceva. Etichete identice înseamnă aceleași date. O etichetă diferită înseamnă că fișierul s-a schimbat, chiar dacă numele, dimensiunea și data lui au rămas aceleași. Acel fișier o ia atunci de la capăt, cu o încărcare nouă în stocare și cu nonce-uri noi, așa că niciun nonce nu e folosit vreodată de două ori pentru date diferite.
Limitele
- O încărcare poate fi continuată doar în browserul și pe dispozitivul care au pornit-o, pentru că secretul din care sunt derivate nonce-urile ei e păstrat doar în acel browser.
- Oferta de a continua durează până la șapte zile de la începutul încărcării, sau până când linkul ei ar fi expirat, dacă asta se întâmplă mai devreme. Stocarea păstrează părțile unei încărcări neterminate șapte zile de la momentul în care a început încărcarea fiecărui fișier, așa că ele sunt încă acolo cât timp oferta e valabilă.
- O singură pagină odată poate lucra la o anumită încărcare. Dacă o altă filă o continuă deja, pagina îți spune asta în loc să pornească o a doua copie.
- Dacă între timp transferul a fost șters sau a expirat, nu mai rămâne nimic de continuat, iar pagina îți spune asta.
- Dacă browserul tău nu permite acestui site să păstreze date, încărcarea rulează totuși, dar nu poate fi continuată după o reîncărcare.
Încearcă
Pornește o încărcare găzduită mare, închide fila pe parcurs și deschide din nou Transferify în același browser: încărcarea îți e oferită înapoi. Trimite un fișier acum.
Întrebări frecvente
Ce se întâmplă dacă mi se întrerupe conexiunea în timpul unei încărcări?
Încărcarea așteaptă și încearcă din nou. O cerere e reîncercată până la zece minute de eșecuri, cu pauze tot mai lungi între încercări, iar timpul petrecut de browserul tău offline nu se scade din aceste zece minute. Părțile care au ajuns deja în stocare nu sunt trimise din nou.
Pot continua o încărcare după ce închid fila sau reîncarc pagina?
Da, în același browser, pe același dispozitiv, autentificat în același cont, timp de până la șapte zile de la începutul încărcării, sau până când linkul ei ar fi expirat, dacă asta se întâmplă mai devreme. Când deschizi din nou Transferify, îți oferă să continui și trimite doar ce nu are deja stocarea.
Pot continua încărcarea pe alt calculator?
Nu. Secretul din care sunt derivate nonce-urile unei încărcări neterminate e păstrat doar în browserul care a pornit-o și nu îl părăsește niciodată. Așa că o încărcare continuată rămâne în acel browser.
Trebuie să aleg din nou fișierele?
Pentru încărcări de până la 2 GiB în total, browserul tău păstrează de obicei propria copie, așa că nu trebuie. Pentru încărcări mai mari, alegi din nou aceleași fișiere, iar Transferify verifică dacă sunt aceleași fișiere înainte să continue.