2013-06-01 51 views
7

bài viết giới thiệu: Amazon S3 & Checksum, How to encode md5 sum into base64 in BASHLàm thế nào để lập trình có được MD5 Checksum của Amazon S3 tập tin sử dụng boto

tôi phải tải về một tập tin tar từ S3 xô với quyền truy cập hạn chế. [Chủ yếu là quyền truy cập chỉ dành cho tải về]

Sau khi tôi tải Tôi phải kiểm tra tổng kiểm tra md5 của file tải so với MD5-Check Sum của dữ liệu hiện nay như siêu dữ liệu trong S3

Tôi hiện đang sử dụng một Trình duyệt tập tin S3 để tự lưu ý "x-amz-meta-md5" của tiêu đề nội dung và xác nhận giá trị đó so với md5 tính của tệp đã tải xuống.

Tôi muốn biết nếu có cách lập trình sử dụng boto để nắm bắt giá trị băm md5 của tệp S3 như được đề cập dưới dạng siêu dữ liệu.

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(?)** 

Vui lòng sửa nếu hiểu biết của tôi sai. Tôi đang tìm kiếm một cách để nắm bắt các dữ liệu tiêu đề lập trình

Trả lời

9

Khi boto download một file sử dụng bất kỳ get_contents_to_* phương pháp, nó sẽ tính toán MD5 checksum của các byte nó tải về và làm cho rằng sẵn như md5 thuộc tính của đối tượng Key . Ngoài ra, S3 gửi một tiêu đề ETag trong phản hồi đại diện cho ý tưởng của máy chủ về kiểm tra MD5 là gì. Điều này có sẵn dưới dạng thuộc tính etag của đối tượng Key. Vì vậy, sau khi tải xuống một tệp, bạn chỉ có thể so sánh giá trị của hai thuộc tính đó để xem chúng có khớp không.

Nếu bạn muốn tìm hiểu những gì S3 nghĩ rằng MD5 là không thực sự tải tập tin (như trong ví dụ của bạn), bạn chỉ có thể làm điều này:

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

Cảm ơn đề xuất. Giá trị Etag dường như không khớp với tổng kiểm tra MD5 đã tính. Tôi cũng đã thấy trong các bài viết được giới thiệu rằng etag không phải là một giá trị thích hợp của MD5. "x-amz-meta-md5" là khóa trong trình duyệt Tập tin S3 của tôi cung cấp cho tôi giá trị MD5. Tuy nhiên, khóa này không có sẵn trong siêu dữ liệu hoặc tiêu đề nội dung được lấy theo chương trình. – user1652054

+3

Thuộc tính '' etag'' sẽ có dạng '' "797cc49509a9df16481fac4fae144e0a" '' trong khi thuộc tính '' md5'' sẽ là '' 797cc49509a9df16481fac4fae144e0a''. Lưu ý các dấu ngoặc kép kèm theo trong '' etag''. Bạn cần tính đến điều đó khi so sánh các giá trị. Khóa '' x-amz-meta-md5'' không phải là giá trị siêu dữ liệu S3 chuẩn mà là giá trị tùy chỉnh. Có lẽ nó đã được thêm vào bởi trình duyệt File S3? – garnaat

+5

Một nhận xét khác. Tôi đã xem xét mã nguồn của boto và xác nhận rằng boto tự động kiểm tra giá trị của '' etag'' header bằng tính toán '' md5'' khi tải xuống một tệp. Nó sẽ nâng cao ngoại lệ '' S3DataError'' nếu chúng không khớp. – garnaat

6

Nó dường như cũng được thành lập rằng ETag không phải là md5sum nếu tệp được lắp ráp sau khi chạy tải lên nhiều phần. Tôi nghĩ trong trường hợp đó, chỉ có một người truy đòi là tải xuống tệp và thực hiện kiểm tra cục bộ. Nếu kết quả là chính xác, bản sao S3 phải tốt. Nếu checksum cục bộ sai, bản sao s3 có thể bị hỏng hoặc tải xuống có thể không thành công. Nếu bạn không còn có tệp gốc hoặc bản ghi của md5sum của nó nữa, tôi nghĩ bạn sẽ không may mắn. Nó sẽ là tuyệt vời nếu md5sum của tập tin lắp ráp đã có sẵn, hoặc nếu có một cách để tính toán cục bộ dự kiến ​​etag của một tập tin được tải lên thông qua multipart.