Fondamentalmente sto progettando un protocollo che richiede una trasmissione di file sincrona e ordinata da un server (implementato in Node.js) a un dispositivo, su TCP . Lo streaming del file non è un'opzione, quindi ogni chunk di file è incapsulato in un messaggio che contiene altri campi non crittografati, che non rientrano nell'ambito di questa domanda.
Uno dei requisiti è che il contenuto del file non può essere inviato in testo normale, quindi è necessario scegliere uno schema di crittografia, in questo caso ho optato per AES-256-CBC , assumo ai fini di questa domanda l'algoritmo non può essere modificato.
A causa dei vincoli del dispositivo (RAM ~ 10KB), è necessario dividere il file ( < 5 MB ) in chunk, che verrà quindi inviato al dispositivo secondo il protocollo citato, in seguito uno schema send / [ack | repeat] . Alla ricezione, il dispositivo è in grado di memorizzare il blocco sul disco.
Quindi la mia domanda principale qui è che nel back-end devo scegliere tra:
-
Crittografia del file completo e successiva suddivisione in blocchi
- > Sul dispositivo di ricezione aggiungerebbe ciascun blocco in un file e quindi decrittalo quando tutti i blocchi sono stati ricevuti.
vs
-
Dividere il file in blocchi e quindi crittografarli.
- > Richiede l'invio del vettore di inizializzazione (IV) utilizzato su ogni crittografia del blocco per decrittografarlo.
- > Alla ricezione del chunk il dispositivo dovrebbe decifrare il chunk o memorizzarne ciascuno con il rispettivo IV e quindi decrittografarli dopo aver ricevuto l'ultimo chunk.
L'obiettivo qui è capire quali sono i problemi di sicurezza derivanti da ciascun approccio e anche un confronto di overhead tra di essi.
PS: ho anche uno schema di convalida dell'integrità ma è fuori dall'ambito della domanda.