Sto memorizzando i file su S3, alcuni dei quali sono molto grandi e devono essere memorizzati crittografati. Avevo programmato di utilizzare Galois Counter Mode poiché include il MAC, tuttavia questo non funzionerebbe con i caricamenti multipart in S3. Devo crittografare ogni blocco e memorizzarlo su S3 insieme a un MAC corretto, quindi calcolare il MAC per l'intero file una volta che tutte le parti sono a posto. Una volta che un caricamento multipart in S3 è "completato", le parti non sono più accessibili e c'è solo il singolo file. Penso di aver bisogno di un meccanismo di hash tree per supportarlo (si noti che il sistema di storage di Amazon Glacier utilizza questo metodo), ma preferirei evitare di far girare il mio MAC per tutti i soliti motivi.
Ecco una pagina che spiega come Glacier utilizza l'hashing degli alberi: link
Qualche suggerimento? Molte grazie in anticipo.
Aggiorna
Finalmente ho funzionato. Ho hackerato la classe GCMBlockCipher in BouncyCastle per supportare questo. Ecco le modifiche che è necessario apportare:
- La chiave di crittografia e la IV dovranno essere archiviate in un luogo sicuro (magari crittografate in un database) in modo che tutte le macchine che elaborano le singole parti siano in grado di calcolare gli stessi valori iniziali come la sottochiave hash.
- Anche se non è necessario conoscere in anticipo la lunghezza totale, sarà necessario un indice di blocco iniziale inviato con ciascun blocco e ogni blocco inviato (eccetto il finale) deve essere un multiplo di 16 byte.
- Il valore del contatore deve essere incrementato in base all'indice del blocco iniziale per il blocco.
- Un'implementazione che gestisce la crittografia mentre un lungo flusso esegue una singola moltiplicazione GHASH per blocco elaborato. Nel momento in cui viene elaborato l'ultimo blocco, il valore di hash sarà corretto. In un'implementazione parallela è possibile elaborare un chunk da qualche parte nel mezzo, quindi è necessario recuperare le moltiplicazioni "mancanti" che sarebbero state eseguite durante l'elaborazione dei blocchi successivi. Se la lunghezza totale è nota in anticipo, questa correzione può essere applicata subito dopo l'elaborazione di ogni blocco o alla fine una volta che tutte le parti sono state posizionate. I valori di hash per ogni blocco dovranno essere memorizzati.
- Alla fine tutti i valori hash per i blocchi (con le correzioni moltiplicative applicate) devono essere xo'd insieme, quindi inseriti in una forma modificata di doFinal () che esegue il resto dei calcoli GMAC. Nota che anche il conteggio degli ultimi byte deve essere inserito poiché è parte del MAC.
Il più matematicamente inclinato può probabilmente trovare un modo migliore per gestirlo. : -)