Transferify
Torna al blog

Come un grosso caricamento cifrato sopravvive a una connessione interrotta

Un caricamento ospitato di decine o centinaia di gigabyte dura abbastanza a lungo perché qualcosa vada storto: il Wi-Fi cambia punto di accesso, un portatile va in sospensione, una scheda viene ricaricata. Transferify gestisce la situazione su due livelli. Finché la pagina è aperta, una connessione interrotta mette soltanto in pausa il caricamento. Se la pagina non c’è più, lo stesso browser può proseguire il caricamento più tardi e inviare soltanto ciò che manca.

La seconda parte è più difficile di quanto sembri, perché ogni file viene cifrato nel browser prima di essere caricato. Questo articolo spiega come funzionano entrambi i livelli e perché proseguire un caricamento cifrato richiede una cura particolare.

Finché la pagina è aperta: attendere, riprovare, proseguire

Un file ospitato viene caricato in molte parti distinte, e ogni parte è una richiesta a sé (come funziona il caricamento in sé). Quando una richiesta fallisce perché la connessione è caduta o è scaduta, viene ritentata:

  • Il primo nuovo tentativo attende al massimo mezzo secondo, e il limite di ogni pausa successiva raddoppia, fino a 30 secondi.
  • Ogni pausa viene estratta a caso dalla metà superiore del proprio limite, in modo che molte parti fallite insieme non riprovino tutte nello stesso istante.
  • Una richiesta continua a riprovare per un massimo di dieci minuti di insuccessi prima che il caricamento si fermi.
  • Finché il browser segnala di essere offline, il caricamento attende la rete invece di consumare quei dieci minuti, per quanto duri l’interruzione.
  • Una parte che non invia nulla per due minuti viene considerata una connessione persa e ritentata.
  • Ogni nuovo tentativo di una parte usa un indirizzo di caricamento firmato di nuovo, perciò un indirizzo scaduto mentre si era offline viene sostituito.

Una parte che fallisce non ferma le altre. Soltanto una parte che ha esaurito i tentativi pone fine al caricamento, e anche allora il caricamento si ferma in un punto da cui è possibile proseguire.

Una risposta è trattata in modo diverso. Se il nostro servizio risponde di non essere riuscito ad avviare il caricamento di un file nello storage, quella richiesta viene ritentata tre volte nel giro di un secondo o due, e il caricamento si ferma poi allo stesso modo anziché riprovare per minuti, perché quella risposta non significa che la connessione sia caduta.

Tutto questo vale quando si invia un nuovo trasferimento ospitato. L’aggiunta di file a un trasferimento già inviato e il caricamento di file nella richiesta di file di qualcuno mantengono invece tre tentativi rapidi, così in quei casi una connessione persa si nota subito.

Dopo un ricaricamento: proseguire nello stesso browser

Prima che il primo byte di un caricamento lasci il dispositivo, il browser annota ciò che gli servirebbe per proseguirlo più tardi. Quella registrazione è conservata nell’archivio proprio del browser per questo sito (IndexedDB), sul dispositivo, e contiene:

  • la chiave di cifratura del trasferimento, memorizzata come oggetto chiave del browser,
  • un valore casuale segreto da cui derivano i nonce dei file (spiegato più avanti),
  • quali file appartengono al caricamento, con nomi, dimensioni e date di modifica,
  • per un trasferimento Zero-Knowledge, il link di condivisione completo con la sua chiave.

La registrazione resta sul dispositivo. Il valore segreto che contiene non ci viene mai inviato, e nemmeno la chiave in chiaro: nella modalità predefinita il nostro servizio conserva soltanto una copia della chiave avvolta da una chiave in AWS KMS, e nella modalità Zero-Knowledge nessuna copia. Viene eliminata quando il caricamento termina, quando lo si scarta o quando non può più essere proseguito. Un visitatore che non avvia mai un caricamento ospitato non vede scritto nulla.

Quando si ritorna, con l’accesso all’account che ha avviato il caricamento, Transferify propone di proseguire. Chiede allo storage quali parti di ciascun file possiede già, mantiene ogni parte la cui lunghezza è esattamente quella corretta e invia il resto. I file terminati prima dell’interruzione vengono saltati del tutto.

Ritrovare i file

Per i caricamenti fino a 2 GiB in totale, e solo quando il browser ha libero almeno il doppio della dimensione del caricamento, il browser conserva anche una copia dei file stessi, così non occorre sceglierli di nuovo. Per qualsiasi cosa più grande, si scelgono di nuovo gli stessi file.

Transferify abbina ogni file per nome, dimensione e data dell’ultima modifica. Un file modificato nel frattempo ha una data nuova e viene rifiutato, perché le parti già presenti nello storage contengono il vecchio contenuto e il resto deve essere composto dagli stessi byte.

Perché proseguire un caricamento cifrato richiede cura

AES-GCM, il cifrario usato da Transferify, ha una regola che non va mai infranta: la stessa chiave e lo stesso nonce non devono mai sigillare due dati diversi. Chi vedesse entrambi i risultati potrebbe capire in che cosa i due differiscono e potrebbe falsificare dati con quella chiave.

Un caricamento ripreso deve avvicinarsi a quella regola di proposito. Per unirsi alle parti che lo storage possiede già, le parti mancanti devono essere cifrate di nuovo negli stessi identici byte che avrebbero avuto. Ciò significa la stessa chiave e gli stessi nonce di prima. Due misure di sicurezza lo rendono sicuro.

Nonce che si possono ricostruire, e solo da Lei. Per un caricamento ospitato, il valore iniziale dei nonce di ogni file non è un numero casuale che si perde quando la pagina si chiude. Viene derivato con HMAC-SHA-256 dal valore casuale segreto presente nella registrazione del browser, dalla posizione del file nella selezione, dall’identificatore del file e dal caricamento nello storage a cui appartiene. Il browser può derivarlo di nuovo dopo un ricaricamento. I nostri server non possono, perché il segreto non lascia mai il dispositivo.

Prova che i byte non sono cambiati. Prima che qualsiasi parte lasci il dispositivo, il browser conserva il tag di autenticazione di ogni blocco. Quando un caricamento prosegue, il browser cifra di nuovo ogni blocco e confronta il nuovo tag con quello conservato prima di inviare qualsiasi cosa. Tag uguali significano gli stessi dati. Un tag diverso significa che il file è cambiato, anche se nome, dimensione e data no. Quel file ricomincia allora dall’inizio con un nuovo caricamento nello storage, con nonce nuovi, in modo che nessun nonce venga mai usato due volte per dati diversi.

Diagramma decisionale per proseguire un caricamento. Se il browser ha conservato il caricamento, Transferify ritrova i file, chiede allo storage che cosa possiede, cifra di nuovo ogni blocco mancante e ne confronta il tag con quello conservato prima di inviare: se coincide viene inviato, se non coincide quel file riparte con nonce nuovi.Diagramma decisionale per proseguire un caricamento. Se il browser ha conservato il caricamento, Transferify ritrova i file, chiede allo storage che cosa possiede, cifra di nuovo ogni blocco mancante e ne confronta il tag con quello conservato prima di inviare: se coincide viene inviato, se non coincide quel file riparte con nonce nuovi.
Proseguire un caricamento cifrato. Un blocco viene inviato di nuovo con lo stesso nonce solo quando il suo tag dimostra che i byte non sono cambiati.

I limiti

  • Un caricamento può essere proseguito solo nel browser e sul dispositivo che lo ha avviato, perché il segreto da cui derivano i suoi nonce è conservato solo in quel browser.
  • La proposta di proseguire dura fino a sette giorni dopo l’inizio del caricamento, o fino alla scadenza prevista del suo link se questa arriva prima. Lo storage conserva le parti di un caricamento non terminato per sette giorni dall’inizio del caricamento di ciascun file, quindi sono ancora lì per tutto il tempo in cui la proposta resta valida.
  • Solo una pagina alla volta può lavorare su un determinato caricamento. Se un’altra scheda lo sta già proseguendo, la pagina lo segnala invece di avviarne una seconda copia.
  • Se il trasferimento è stato eliminato o è scaduto nel frattempo, non resta nulla da proseguire, e la pagina lo dice.
  • Se il browser non consente a questo sito di conservare dati, il caricamento viene comunque eseguito, ma dopo un ricaricamento non può essere proseguito.

Provare

Avvii un grosso caricamento ospitato, chiuda la scheda a metà e riapra Transferify nello stesso browser: il caricamento Le viene riproposto. Invii un file ora.

Domande frequenti

Che cosa accade se la connessione cade durante un caricamento?

Il caricamento attende e riprova. Una richiesta viene ritentata per un massimo di dieci minuti di insuccessi, con pause sempre più lunghe tra un tentativo e l’altro, e il tempo che il browser trascorre offline non viene contato in quei dieci minuti. Le parti già arrivate nello storage non vengono inviate di nuovo.

Posso proseguire un caricamento dopo aver chiuso la scheda o ricaricato la pagina?

Sì, nello stesso browser, sullo stesso dispositivo, con l’accesso allo stesso account, fino a sette giorni dopo l’inizio del caricamento, o fino alla scadenza prevista del suo link se questa arriva prima. Quando riapre Transferify, viene proposto di proseguire e viene inviato solo ciò che lo storage non possiede già.

Posso proseguire il caricamento su un altro computer?

No. Il segreto da cui derivano i nonce di un caricamento non terminato è conservato solo nel browser che lo ha avviato e non lo lascia mai. Perciò un caricamento ripreso resta in quel browser.

Devo scegliere di nuovo i file?

Per i caricamenti fino a 2 GiB in totale, il browser di solito conserva una propria copia, quindi non è necessario. Per i caricamenti più grandi, sceglie di nuovo gli stessi file e Transferify verifica che siano gli stessi prima di proseguire.

Pagine correlate

Torna su