Appena verificato uno. Un saluto affettuoso ad Amazon per renderlo abbastanza semplice da essere indovinato.
Supponiamo che tu abbia caricato un file da 14 MB e che la dimensione della parte sia 5 MB. Calcola 3 checksum MD5 corrispondenti a ciascuna parte, ovvero il checksum del primo 5 MB, il secondo 5 MB e gli ultimi 4 MB. Quindi prendi il checksum della loro concatenazione. Poiché i checksum MD5 sono rappresentazioni esadecimali di dati binari, assicurati di prendere l'MD5 della concatenazione binaria decodificata, non della concatenazione codificata ASCII o UTF-8. Quando ciò è fatto, aggiungi un trattino e il numero di parti per ottenere l'ETag.
Qui ci sono i comandi per farlo su Mac OS X dalla console:
$ dd bs=1m count=5 skip=0 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019611 secs (267345449 bytes/sec)
$ dd bs=1m count=5 skip=5 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019182 secs (273323380 bytes/sec)
$ dd bs=1m count=5 skip=10 if=someFile | md5 >>checksums.txt
2+1 records in
2+1 records out
2599812 bytes transferred in 0.011112 secs (233964895 bytes/sec)
A questo punto tutti i checksum sono in checksums.txt
.Per concatenare loro e decodificare l'esagono e ottenere il checksum MD5 del lotto, basta usare
$ xxd -r -p checksums.txt | md5
E ora aggiungere "-3" per ottenere l'ETag, dato che c'erano 3 parti.
Vale la pena notare che il md5
su Mac OS X scrive solo il checksum, ma md5sum
su Linux restituisce anche il nome file. Dovrai spogliarlo, ma sono sicuro che ci sono alcune opzioni per emettere solo i checksum. Non devi preoccuparti della causa dello spazio bianco, xxd
lo ignorerai.
Nota: Se hai caricato con aws-cli via aws s3 cp
allora è più probabile avere un chunksize 8MB. Secondo lo docs, questo è il valore predefinito.
Aggiornamento: mi è stato detto circa l'implementazione di questo a https://github.com/Teachnova/s3md5, che non funziona su OS X. Ecco un Gist che ho scritto con un working script for OS X.
fonte
2013-11-10 23:59:44
Giusto per chiarire, il problema non è che l'algoritmo ETag in qualche modo cambia se il file è superiore a 5 GB. L'algoritmo ETag è diverso per i caricamenti non multipart e per i caricamenti multipart. Incontrerai lo stesso problema cercando di calcolare l'ETag di un file da 6 MB se è stato caricato utilizzando una parte da 5 MB e una da 1 MB. MD5 viene utilizzato per caricamenti non multipart, che hanno un limite di 5 GB. L'algoritmo nella mia risposta è utilizzato per i caricamenti multipart, che hanno un limite di 5 GB per parte. –
È anche diverso se la crittografia lato server è abilitata. Penso che etag dovrebbe probabilmente essere considerato come un dettaglio di implementazione, e non essere affidato al lato client. – wim