Transferify
Torna al blog

Come il browser carica i file cifrati direttamente nello storage

Quando invia un trasferimento ospitato, il browser cifra ogni file e lo carica direttamente nel nostro storage a oggetti nell’UE. Il file non passa dalla nostra api lungo il percorso. L’api decide se un caricamento può iniziare, firma un indirizzo di breve durata per ogni porzione e controlla il risultato prima che il link diventi attivo. Il lavoro pesante lo svolge il browser.

Questo articolo percorre quel tragitto, dal momento in cui si trascina un file fino al momento in cui il link funziona.

Perché caricare direttamente nello storage

Il modo consueto di costruire un caricamento consiste nell’inviare il file a un application server, che poi lo scrive nello storage. Ogni byte attraversa così due reti, e l’application server diventa il collo di bottiglia per tutti i file grandi insieme.

Transferify salta questo passaggio. Il nostro storage parla il protocollo S3, che consente a un servizio di distribuire indirizzi firmati: un indirizzo web che autorizza una sola azione precisa, per esempio caricare una determinata parte di un determinato file, fino alla sua scadenza. Il browser invia ogni parte cifrata direttamente a uno di questi indirizzi. L’api non gestisce mai i byte del file, solo le piccole richieste che preparano il caricamento e lo concludono.

Lo storage si trova nell’UE. I nuovi file vanno su Cloudflare R2, limitato alla sua giurisdizione UE. I file archiviati prima di questa modifica restano su AWS S3 a Francoforte.

Sequenza di un caricamento ospitato. Il browser registra il trasferimento presso il nostro servizio; poi, per ogni gruppo di file, il nostro servizio avvia i caricamenti nello storage e firma gli indirizzi delle parti, il browser carica le parti cifrate direttamente nello storage e il nostro servizio controlla il numero di parti e la dimensione di ogni file prima che il link diventi attivo.Sequenza di un caricamento ospitato. Il browser registra il trasferimento presso il nostro servizio; poi, per ogni gruppo di file, il nostro servizio avvia i caricamenti nello storage e firma gli indirizzi delle parti, il browser carica le parti cifrate direttamente nello storage e il nostro servizio controlla il numero di parti e la dimensione di ogni file prima che il link diventi attivo.
Un caricamento ospitato. Le parti cifrate vanno direttamente dal browser allo storage; il nostro servizio si limita ad avviare i caricamenti, firmare gli indirizzi e controllare il risultato.

Passo 1: il trasferimento viene registrato

Prima che venga caricato qualsiasi cosa, il browser comunica al nostro servizio che cosa sta per inviare: i dettagli dei file e le opzioni scelte. Il servizio verifica che il trasferimento rientri nel Suo piano, per esempio nella dimensione di caricamento che il piano consente, e crea il trasferimento.

Passo 2: i file si muovono in gruppi

I file procedono poi in gruppi di al massimo 100. Per ogni gruppo, una richiesta chiede al nostro servizio di avviare un caricamento nello storage per ciascun file del gruppo, e la verifica del piano viene eseguita di nuovo. Più avanti, una richiesta completa l’intero gruppo.

Il raggruppamento mantiene basso il numero di richieste. Un trasferimento di 10.000 file richiede circa 300 richieste al nostro servizio, mentre una richiesta per file e per passo ne richiederebbe circa 30.000.

Passo 3: il file viene cifrato e tagliato in parti

Il browser legge il file come flusso e lo cifra con AES-256-GCM in blocchi: 8 MiB per la maggior parte dei file e un multiplo maggiore di 8 MiB per quelli molto grandi. Lo storage accetta al massimo 10.000 parti per file e un file ha esattamente tante parti quanti sono i suoi blocchi cifrati, perciò la dimensione del blocco cresce con il file per restare entro questo limite. Come funziona la cifratura in sé, e dove va a finire la chiave, è spiegato in come Transferify cifra i file nel browser.

Le parti sono porzioni di uguale lunghezza del flusso cifrato, e non i blocchi stessi, perché lo storage richiede che ogni parte, tranne l’ultima, abbia esattamente la stessa lunghezza.

Passo 4: ogni parte ha il proprio indirizzo firmato

Per ogni parte, il nostro servizio firma un indirizzo che consente di caricare quella sola parte, valido per 12 ore. Il browser richiede gli indirizzi a lotti, poco prima delle parti che li useranno, così un indirizzo viene impiegato molto prima della scadenza. Quando una parte deve essere inviata di nuovo, riceve un indirizzo firmato di nuovo.

Passo 5: molte parti in corso, entro un budget di memoria

Una singola connessione verso lo storage raramente riempie una linea veloce. Per questo il browser tiene in corso più parti contemporaneamente e, mentre una parte è in transito, la successiva è già in fase di cifratura.

Quante parti procedano in parallelo lo decide il dispositivo, in due passaggi:

  • Un budget di memoria. Le parti cifrate devono restare in memoria finché lo storage non le conferma. Il browser fissa un budget in base al tipo di dispositivo, molto più ridotto sugli smartphone, e non tiene mai in corso più parti di quante ne contenga.
  • Misurato, non stimato. Il browser parte dall’ampiezza che il budget consente, normalmente quattro parti, e prova ad aggiungere caricamenti paralleli finché la velocità misurata continua a migliorare, fino a 16 insieme. Non scende mai sotto l’ampiezza iniziale, perciò la ricerca non può rendere un caricamento più lento di quanto sarebbe stato.

Il file viene letto dal disco solo alla velocità con cui le parti partono, quindi un file molto più grande della memoria del dispositivo si carica senza problemi.

Passo 6: lo storage conferma, il nostro servizio controlla

Quando tutte le parti dei file di un gruppo sono nello storage, il browser chiede al nostro servizio di completarli. Prima che un file venga accettato, il servizio verifica che:

  • il numero di parti corrisponda al numero di blocchi cifrati che il file deve avere,
  • la dimensione archiviata corrisponda, al byte, a quella che deve avere un file cifrato della dimensione annunciata.

Se la dimensione archiviata non è corretta, la copia archiviata viene eliminata e il file non viene accettato. Quando ogni file del trasferimento è completo, il link di condivisione diventa attivo.

Quando qualcosa va storto

  • Una parte fallisce. Viene ritentata con un indirizzo firmato di nuovo. Le connessioni perse vengono attese, e un caricamento interrotto da un ricaricamento della pagina può essere ripreso più tardi nello stesso browser. I dettagli sono in come un grosso caricamento cifrato sopravvive a una connessione interrotta.
  • Lo storage rifiuta di completare un file. Quel file viene caricato di nuovo, fino a un massimo di tre volte in tutto, prima che il caricamento rinunci.
  • Lei annulla. I caricamenti ancora aperti nello storage vengono annullati e il trasferimento viene scartato. Tutto ciò che lo storage conserva di un caricamento non terminato viene cancellato automaticamente sette giorni dopo l’inizio di quel caricamento.

Provare

Trascini un file grande in Transferify, scelga un link ospitato e osservi l’avanzamento: ciò che vede è il suo stesso browser che cifra e carica in parallelo. Invii un file ora.

Domande frequenti

Il mio file passa dall’api di Transferify prima di arrivare nello storage?

No. Il browser invia il file cifrato direttamente al nostro storage a oggetti nell’UE. La nostra api registra il trasferimento, firma un indirizzo di breve durata per ogni parte e controlla il risultato alla fine, ma i byte del file non passano da essa.

Perché il mio file viene diviso in parti?

Le parti permettono di caricare un file grande su più connessioni contemporaneamente e di inviare di nuovo una singola parte fallita senza ricominciare l’intero file. Ogni parte è una porzione del file già cifrato.

Per caricare un file grande serve molta memoria?

No. Il browser legge e cifra il file un pezzo alla volta e tiene in memoria solo le parti in corso di invio. Quante parti possono essere in corso insieme è limitato da un budget di memoria che dipende dal tipo di dispositivo.

Che cosa impedisce a un caricamento interrotto o incompleto di diventare un link di download?

Quando un file termina, il nostro servizio verifica che lo storage contenga esattamente il numero di parti e la dimensione cifrata esatta che il file deve avere. Se la dimensione archiviata non è corretta, la copia archiviata viene eliminata e il file non viene accettato.

Pagine correlate

Torna su