2013-06-01 13 views
7

Messaggi referiti: Amazon S3 & Checksum, How to encode md5 sum into base64 in BASHCome ottenere la programmazione MD5 Checksum dei file di Amazon S3 utilizzando Boto

devo scaricare un file tar da S3 secchio con accesso limitato. [Per lo più autorizzazioni di accesso dati solo per scaricare]

Dopo scaricare devo controllare la checksum MD5 del file scaricato contro l'MD5-Check somma dei dati presenti come metadati in S3

Io attualmente uso un Browser di file S3 per annotare manualmente "x-amz-meta-md5" dell'intestazione del contenuto e convalidare tale valore rispetto all'md5 calcolato del file scaricato.

Vorrei sapere se esiste un modo programmatico con boto per acquisire il valore hash md5 di un file S3 come menzionato come metadati.

from boto.s3.connection import S3Connection 

conn = S3Connection(access_key, secret_key) 
bucket=conn.get_bucket("test-bucket") 
rs_keys = bucket.get_all_keys() 
for key_val in rs_keys: 
    print key_val, key_val.**HOW_TO_GET_MD5_FROM_METADATA(?)** 

Si prega di correggere se la mia comprensione è sbagliato. Sto cercando un modo per catturare i dati di intestazione di programmazione

risposta

9

Quando boto scarica un file utilizzando uno dei get_contents_to_* metodi, calcola il checksum MD5 dei byte che scarica e fa che disponibile come attributo md5 dell'oggetto Key . Inoltre, S3 invia un'intestazione ETag nella risposta che rappresenta l'idea del server di ciò che è il checksum MD5. È disponibile come attributo etag dell'oggetto Key. Quindi, dopo aver scaricato un file, puoi semplicemente confrontare il valore di questi due attributi per vedere se corrispondono.

Se si vuole scoprire cosa S3 pensa che il MD5 è senza in realtà il download (come mostrato nel tuo esempio) si può solo fare questo:

for key_val in rs_keys: 
    print key_val, key_val.etag 
+2

Grazie per il suggerimento. Il valore Etag sembra non corrispondere alla somma di controllo MD5 calcolata. Ho anche visto nei post di riferimento che etag non è un valore appropriato di MD5. "x-amz-meta-md5" è la chiave del mio browser S3 File che mi dà il valore MD5. Tuttavia, questa chiave non è disponibile in metadati o intestazioni di contenuto da ottenere in modo programmatico. – user1652054

+3

L'attributo '' etag'' sarà nella forma '' "797cc49509a9df16481fac4fae144e0a" '' mentre l'attributo '' md5'' sarà '' 797cc49509a9df16481fac4fae144e0a''. Notare le doppie virgolette racchiuse in '' etag''. È necessario tenerne conto quando si confrontano i valori. La chiave '' x-amz-meta-md5'' non è un valore di metadati S3 standard ma uno personalizzato. Forse è stato aggiunto dal browser S3 File? – garnaat

+5

Un altro commento. Ho rivisto il codice sorgente di boto e ho confermato che boto controlla automaticamente il valore dell'intestazione '' etag'' con il '' md5'' calcolato durante il download di un file. Solleverà l'eccezione '' S3DataError'' se non corrispondono. – garnaat

6

Sembra ben stabilito che l'ETag non è md5sum se il file è stato assemblato dopo aver eseguito un caricamento multiparte. Penso che in tal caso l'unica risorsa è scaricare il file ed eseguire un checksum localmente. Se il risultato è corretto, la copia S3 deve essere buona. Se il checksum locale è errato, la copia s3 potrebbe essere danneggiata o il download potrebbe non essere riuscito. Se non hai più il file originale o un record del suo md5sum, penso che tu sia sfortunato. Sarebbe bello se il md5sum del file assemblato fosse disponibile, o se ci fosse un modo per calcolare localmente l'etag previsto di un file da caricare via multipart.