Cum încarcă browserul tău fișiere criptate direct în stocare
Când trimiți un transfer găzduit, browserul tău criptează fiecare fișier și îl încarcă direct în stocarea noastră de obiecte din UE. Pe drum, fișierul nu trece prin API-ul nostru. API-ul decide dacă o încărcare poate începe, semnează o adresă de scurtă durată pentru fiecare parte și verifică rezultatul înainte ca linkul să devină activ. Munca grea o face browserul tău.
Articolul acesta urmărește acel drum, din momentul în care pui un fișier în pagină până în momentul în care linkul funcționează.
De ce direct în stocare
Calea obișnuită de a construi o încărcare e să trimiți fișierul unui server de aplicație, care îl scrie apoi în stocare. Atunci fiecare octet traversează două rețele, iar serverul de aplicație devine blocajul tuturor fișierelor mari în același timp.
Transferify sare peste acest pas. Stocarea noastră folosește protocolul S3, care îi permite unui serviciu să ofere adrese semnate: o adresă web care permite o singură acțiune anume, de exemplu încărcarea unei anumite părți a unui anumit fișier, până când adresa expiră. Browserul tău trimite fiecare parte criptată direct la o astfel de adresă. API-ul nu procesează niciodată octeții fișierului, ci doar cererile mici care pregătesc încărcarea și o încheie.
Stocarea e în UE. Fișierele noi ajung în Cloudflare R2, restricționat la jurisdicția UE. Fișierele stocate înainte de această schimbare rămân pe AWS S3, în Frankfurt.
Pasul 1: transferul e înregistrat
Înainte să se încarce ceva, browserul tău îi spune serviciului nostru ce urmează să trimită: detaliile fișierelor și opțiunile pe care le-ai ales. Serviciul verifică dacă transferul se încadrează în planul tău, de exemplu în dimensiunea de încărcare pe care o permite planul tău, și creează transferul.
Pasul 2: fișierele merg în grupuri
Apoi fișierele merg în grupuri de până la 100. Pentru fiecare grup, o singură cerere îi cere serviciului nostru să pornească o încărcare în stocare pentru fiecare fișier din grup, iar verificarea planului rulează din nou. Mai târziu, o singură cerere finalizează tot grupul.
Gruparea ține mic numărul de cereri. Un transfer de 10.000 de fișiere are nevoie de aproximativ 300 de cereri către serviciul nostru, pe când o cerere pentru fiecare fișier la fiecare pas ar însemna aproximativ 30.000.
Pasul 3: fișierul e criptat și tăiat în părți
Browserul tău citește fișierul ca flux și îl criptează cu AES-256-GCM pe bucăți: 8 MiB pentru majoritatea fișierelor și un multiplu mai mare de 8 MiB pentru cele foarte mari. Stocarea acceptă cel mult 10.000 de părți pe fișier, iar un fișier are exact atâtea părți câte bucăți criptate are, așa că dimensiunea bucății crește odată cu fișierul, ca să rămână în această limită. Cum funcționează criptarea în sine și unde ajunge cheia e explicat în cum criptează Transferify fișierele în browserul tău.
Părțile sunt felii de lungime egală din fluxul criptat, nu bucățile însele, pentru că stocarea cere ca fiecare parte, în afară de ultima, să aibă exact aceeași lungime.
Pasul 4: fiecare parte primește propria adresă semnată
Pentru fiecare parte, serviciul nostru semnează o adresă care permite încărcarea doar a acelei părți, valabilă 12 ore. Browserul tău cere adresele în loturi, puțin înaintea părților care le vor folosi, așa că o adresă e folosită cu mult înainte să expire. Când o parte trebuie trimisă din nou, primește o adresă semnată nouă.
Pasul 5: multe părți pe drum, într-un buget de memorie
O singură conexiune către stocare rareori umple o linie rapidă. De aceea browserul tău ține mai multe părți pe drum deodată, iar cât timp o parte e în transmisie, următoarea e deja criptată.
Câte părți rulează în paralel se decide pe dispozitivul tău, în doi pași:
- Un buget de memorie. Părțile criptate trebuie ținute în memorie până când stocarea le confirmă. Browserul stabilește un buget pentru tipul tău de dispozitiv, mult mai mic pe telefoane, și nu ține niciodată pe drum mai multe părți decât încap în el.
- Măsurat, nu ghicit. Browserul pornește de la lățimea pe care o permite bugetul, de obicei patru părți, și încearcă să adauge încărcări paralele cât timp viteza măsurată continuă să crească, până la 16 deodată. Nu coboară niciodată sub lățimea de pornire, așa că această căutare nu poate face o încărcare mai lentă decât ar fi fost.
Fișierul e citit de pe disc doar atât de repede cât pleacă părțile, așa că un fișier mult mai mare decât memoria dispozitivului se încarcă fără probleme.
Pasul 6: stocarea confirmă, serviciul nostru verifică
Când toate părțile fișierelor unui grup sunt în stocare, browserul tău îi cere serviciului nostru să le finalizeze. Înainte ca un fișier să fie acceptat, serviciul verifică:
- că numărul de părți corespunde numărului de bucăți criptate pe care trebuie să le aibă fișierul,
- că dimensiunea stocată corespunde, la octet, cu cea pe care trebuie să o aibă un fișier criptat de dimensiunea anunțată.
Dacă dimensiunea stocată e greșită, copia stocată e ștearsă, iar fișierul nu e acceptat. După ce toate fișierele transferului sunt complete, linkul de partajare devine activ.
Când ceva nu merge
- O parte eșuează. E încercată din nou cu o adresă semnată nouă. Conexiunile pierdute sunt așteptate, iar o încărcare întreruptă de o reîncărcare a paginii poate fi continuată mai târziu în același browser. Detaliile sunt în cum supraviețuiește o încărcare criptată mare unei conexiuni întrerupte.
- Stocarea refuză să finalizeze un fișier. Acel fișier e încărcat din nou, de până la trei ori în total, înainte ca încărcarea să renunțe.
- Anulezi. Încărcările încă deschise în stocare sunt anulate, iar transferul e abandonat. Tot ce mai păstrează stocarea dintr-o încărcare neterminată e șters automat la șapte zile după ce a început acea încărcare.
Încearcă
Pune un fișier mare în Transferify, alege un link găzduit și urmărește progresul: ce vezi e chiar browserul tău care criptează și încarcă în paralel. Trimite un fișier acum.
Întrebări frecvente
Trece fișierul meu prin API-ul Transferify în drum spre stocare?
Nu. Browserul tău trimite fișierul criptat direct în stocarea noastră de obiecte din UE. API-ul nostru înregistrează transferul, semnează o adresă de scurtă durată pentru fiecare parte și verifică rezultatul la final, dar octeții fișierului nu trec prin el.
De ce e împărțit fișierul meu în părți?
Părțile permit unui fișier mare să urce pe mai multe conexiuni deodată și permit ca o parte eșuată să fie trimisă din nou fără ca tot fișierul să o ia de la capăt. Fiecare parte e o felie din fișierul deja criptat.
Încărcarea unui fișier mare are nevoie de multă memorie?
Nu. Browserul tău citește și criptează fișierul bucată cu bucată și ține în memorie doar părțile aflate pe drum. Câte părți ține pe drum e limitat de un buget de memorie pentru tipul tău de dispozitiv.
Ce împiedică o încărcare deteriorată sau incompletă să devină un link de descărcare?
Când un fișier se termină, serviciul nostru verifică dacă stocarea are exact numărul de părți și exact dimensiunea criptată pe care trebuie să le aibă fișierul. Dacă dimensiunea stocată e greșită, copia stocată e ștearsă, iar fișierul nu e acceptat.