View a markdown version of this page

Memeriksa integritas objek untuk unggahan data di Amazon S3 - Amazon Simple Storage Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memeriksa integritas objek untuk unggahan data di Amazon S3

Amazon S3 menggunakan nilai checksum untuk memverifikasi integritas data selama operasi upload dan download. Saat Anda mengunggah data, AWS SDK dan Konsol Manajemen AWS menggunakan algoritma checksum yang Anda pilih untuk menghitung nilai checksum sebelum transmisi data. S3 kemudian secara independen menghitung checksum data Anda dan memvalidasinya terhadap nilai checksum yang disediakan. Objek diterima hanya setelah mengkonfirmasi integritas data dipertahankan selama transit. S3 menyimpan nilai checksum sebagai metadata objek dan objek itu sendiri.

Untuk memverifikasi integritas objek, Anda dapat meminta nilai checksum selama unduhan. Validasi ini bekerja secara konsisten di seluruh mode enkripsi, ukuran objek, kelas penyimpanan, dan unggahan bagian tunggal dan multibagian. Untuk mengubah algoritma checksum untuk unggahan, Anda dapat menyalin objek individual atau menggunakan salinan batch untuk beberapa objek.

Untuk unggahan satu bagian, Anda dapat memberikan nilai checksum sebagai header. Anda dapat memberikan nilai yang telah dihitung sebelumnya atau membiarkan AWS SDK menghitungnya selama upload. Jika nilai checksum yang dihitung oleh S3 cocok dengan nilai yang Anda berikan, permintaan diterima. Jika nilainya tidak cocok, permintaan ditolak.

Untuk unggahan multipart, AWS SDK dapat secara otomatis membuat checksum terakhir untuk unggahan dalam potongan. Saat Anda menggunakan checksum terakhir, Amazon S3 menghasilkan nilai checksum untuk setiap bagian menggunakan algoritma yang Anda tentukan dan menambahkan nilai checksum ke akhir permintaan unggahan yang dipotong. S3 melakukan verifikasi dan mengunggah dalam satu pass, meningkatkan efisiensi. Untuk informasi selengkapnya, lihatMenggunakan checksum trailing.

Menggunakan algoritma checksum yang didukung

Dengan Amazon S3, Anda dapat memilih algoritma checksum untuk menghitung nilai checksum selama upload. Algoritma checksum yang ditentukan kemudian disimpan dengan objek Anda dan dapat digunakan untuk memvalidasi integritas data selama unduhan. Anda dapat memilih salah satu algoritma checksum Secure Hash Algorithms (SHA) atau Cyclic Redundancy Check (CRC) berikut untuk menghitung nilai checksum:

  • CRC-64/NVME (CRC64NVME)

  • CRC-32 (CRC32)

  • CRC-32C (CRC32C)

  • SHA-1 (SHA1)

  • SHA-256 (SHA256)

  • MD5 () MD5

  • XxHash64 () XXHASH64

  • XxHash3 () XXHASH3

  • XxHash128 () XXHASH128

  • SHA-512 (SHA512)

catatan

content-MD5Header hanya tersedia menggunakan S3 ETag untuk objek yang diunggah dalam unggahan bagian tunggal (PUToperasi) yang menggunakan en SSE-S3 kripsi.

Selain itu, Anda dapat memberikan checksum dengan setiap permintaan menggunakan Content-MD5 header.

Saat Anda mengunggah objek, Anda menentukan algoritma yang ingin Anda gunakan:

  • Saat Anda menggunakan Konsol Manajemen AWS, pilih algoritma checksum yang ingin Anda gunakan. Anda dapat secara opsional menentukan nilai checksum objek. Ketika Amazon S3 menerima objek, itu menghitung checksum dengan menggunakan algoritma yang Anda tentukan. Jika kedua nilai checksum tidak cocok, Amazon S3 menghasilkan kesalahan.

  • Saat Anda menggunakan SDK, perhatikan hal-hal berikut:

    • Setel ChecksumAlgorithm parameter ke algoritma yang ingin Anda gunakan Amazon S3. Jika Anda sudah memiliki checksum yang telah dihitung sebelumnya, Anda meneruskan nilai checksum ke AWS SDK, dan SDK menyertakan nilai dalam permintaan. Jika Anda tidak melewati nilai checksum atau tidak menentukan algoritma checksum, SDK secara otomatis menghitung nilai checksum untuk Anda dan menyertakannya dengan permintaan untuk memberikan perlindungan integritas. Jika nilai checksum individual tidak cocok dengan nilai yang ditetapkan dari algoritma checksum, Amazon S3 gagal melakukan permintaan dengan BadDigest kesalahan.

    • Jika Anda menggunakan SDK yang ditingkatkan, AWS SDK memilih algoritma checksum untuk Anda. Namun, Anda dapat mengganti algoritma checksum ini.

    • Jika Anda tidak menentukan algoritma checksum dan SDK juga tidak menghitung checksum untuk Anda, maka S3 secara otomatis memilih algoritma checksum CRC-64/NVME (CRC64NVME).

  • Saat Anda menggunakan REST API, jangan gunakan x-amz-sdk-checksum-algorithm parameter. Sebagai gantinya, gunakan salah satu header khusus algoritma (misalnya,). x-amz-checksum-crc32

Untuk menerapkan salah satu nilai checksum ini ke objek yang sudah diunggah ke Amazon S3, Anda dapat menyalin objek dan menentukan apakah Anda ingin menggunakan algoritma checksum yang ada atau yang baru. Jika Anda tidak menentukan algoritma, S3 menggunakan algoritma yang ada. Jika objek sumber tidak memiliki algoritma checksum atau nilai checksum yang ditentukan, Amazon S3 menggunakan CRC-64/NVME algoritma untuk menghitung nilai checksum untuk objek tujuan. Anda juga dapat menentukan algoritma checksum saat menyalin objek menggunakan Oper asi Batch S3.

penting

Jika Anda menggunakan unggahan multipart dengan Checksum untuk checksum gabungan (atau tingkat bagian), nomor bagian upload multipart harus berurutan dan dimulai dengan 1. Jika Anda mencoba menyelesaikan permintaan unggahan multipart dengan nomor bagian yang tidak berurutan, Amazon S3 menghasilkan kesalahanHTTP 500 Internal Server.

Objek penuh dan tipe checksum komposit

Di Amazon S3, ada dua jenis checksum yang didukung:

  • Checksum objek penuh: Checksum objek penuh dihitung berdasarkan semua konten unggahan multipart, mencakup semua data dari byte pertama dari bagian pertama hingga byte terakhir dari bagian terakhir. Ketahuilah bahwa jika Anda menggunakan Konsol Manajemen AWS untuk mengunggah objek yang berukuran lebih kecil dari 16 MB, hanya jenis checksum objek lengkap yang didukung.

    catatan

    Objek yang Anda unggah PutObject menggunakan jenis checksum objek lengkap. Anda tidak perlu menentukan jenis checksum.

  • Checksum gab ungan: Checksum komposit dihitung berdasarkan checksum individu dari setiap bagian dalam unggahan multipart. Alih-alih menghitung checksum berdasarkan semua konten data, pendekatan ini menggabungkan checksum tingkat bagian (dari bagian pertama hingga yang terakhir) untuk menghasilkan checksum gabungan tunggal untuk objek lengkap. Anda hanya dapat menggunakan tipe checksum komposit dengan algoritma checksum tertentu dan hanya saat menggunakan unggahan multipart untuk mengunggah objek Anda. Untuk algoritma yang mendukung setiap jenis checksum, lihat Unggahan multibagian bagian.

    catatan

    Ketika sebuah objek diunggah sebagai unggahan multipart, tag entitas (ETag) untuk objek bukanlah ringkasan MD5 dari seluruh objek. Sebagai gantinya, Amazon S3 menghitung ringkasan MD5 dari setiap bagian individu saat diunggah. Intisari MD5 digunakan untuk menentukan ETag untuk objek akhir. Amazon S3 menggabungkan byte untuk intisari MD5 dan kemudian menghitung intisari MD5 dari nilai-nilai gabungan ini. Selama langkah pembuatan ETag terakhir, Amazon S3 menambahkan tanda hubung dengan jumlah total bagian sampai akhir.

Unggahan bagian tunggal

Checksum objek yang diunggah dalam satu bagian (menggunakan PutObject) diperlakukan sebagai checksum objek penuh. Saat mengunggah objek di konsol Amazon S3, Anda dapat memilih algoritma checksum yang ingin digunakan S3 dan juga (opsional) memberikan nilai yang telah dihitung sebelumnya. Amazon S3 kemudian memvalidasi nilai checksum yang telah dihitung sebelumnya sebelum menyimpan objek dan nilai checksumnya. Anda dapat memverifikasi integritas data objek saat meminta nilai checksum selama unduhan objek.

Unggahan multibagian

Saat Anda mengunggah objek dalam beberapa bagian menggunakan MultipartUpload API, Anda dapat menentukan algoritma checksum yang ingin digunakan Amazon S3 dan jenis checksum (objek penuh atau komposit).

Tabel berikut menunjukkan jenis algoritma checksum mana yang didukung untuk setiap algoritma checksum dalam unggahan multipart:

Algoritma checksum Objek penuh Komposit
CRC-64/NVME (CRC64NVME) Ya Tidak
CRC-32 (CRC32) Ya Ya
CRC-32C (CRC32C) Ya Ya
SHA-1 (SHA1) Tidak Ya
SHA-256 (SHA256) Tidak Ya
MD5 () MD5 Tidak Ya
XxHash64 () XXHASH64 Tidak Ya
XxHash3 () XXHASH3 Tidak Ya
XxHash128 () XXHASH128 Tidak Ya
SHA-512 (SHA512) Tidak Ya

Menggunakan checksum objek penuh untuk unggahan multipart

Saat membuat atau melakukan upload multipart, Anda dapat menggunakan checksum objek lengkap untuk validasi saat upload. Ini berarti Anda dapat menyediakan algoritma checksum untuk MultipartUpload API, menyederhanakan alat validasi integritas Anda karena Anda tidak perlu lagi melacak batas bagian untuk objek yang diunggah. Anda dapat memberikan checksum dari seluruh objek dalam CompleteMultipartUpload permintaan, bersama dengan ukuran objek.

Saat Anda memberikan checksum objek lengkap selama upload multipart, AWS SDK meneruskan checksum ke Amazon S3, dan S3 memvalidasi integritas objek di sisi server, membandingkannya dengan nilai yang diterima. Kemudian, Amazon S3 menyimpan objek jika nilainya cocok. Jika kedua nilai tidak cocok, S3 gagal dalam permintaan dengan BadDigest kesalahan. Checksum objek Anda juga disimpan dalam metadata objek yang Anda gunakan nanti untuk memvalidasi integritas data objek.

Untuk checksum objek penuh, Anda dapat menggunakan algoritma checksum CRC-64/NVME CRC-32 (CRC64NVMECRC32), (), atau CRC-32C (CRC32C) di S3. Checksum objek penuh dalam unggahan multipart hanya tersedia untuk CRC-based checksum karena dapat melakukan linierisasi menjadi checksum objek penuh. Linearisasi ini memungkinkan Amazon S3 untuk memparalelkan permintaan Anda untuk peningkatan kinerja. Secara khusus, S3 dapat menghitung checksum seluruh objek dari checksum tingkat bagian. Jenis validasi ini tidak tersedia untuk algoritma lain, seperti SHA dan MD5. Karena S3 memiliki perlindungan integritas default, jika objek diunggah tanpa checksum, S3 secara otomatis melampirkan algoritma checksum lengkap objek CRC-64/NVME (CRC64NVME) yang direkomendasikan ke objek.

catatan

Untuk memulai upload multipart, Anda dapat menentukan algoritma checksum dan tipe checksum objek penuh. Setelah Anda menentukan algoritma checksum dan tipe checksum objek penuh, Anda dapat memberikan nilai checksum objek penuh untuk upload multipart.

penting

Saat menggunakan unggahan multipart dengan algoritma checksum baru (MD5, xxHash3, xxHash64, xxHash128, SHA-512), Anda harus menentukan algoritma checksum dalam permintaan menggunakan header. CreateMultipartUpload x-amz-checksum-algorithm Jika Anda memberikan nilai checksum dalam CompleteMultipartUpload permintaan (misalnya,x-amz-checksum-sha512) tanpa menentukan algoritma diCreateMultipartUpload, permintaan akan gagal dengan InvalidRequest kesalahan.

catatan

Untuk algoritma checksum yang ada (CRC32, CRC32C,, SHA-256) SHA-1, jika algoritma tidak ditentukan diCreateMultipartUpload, setiap header checksum yang disediakan saat ini diterima tetapi tidak divalid CompleteMultipartUpload asi atau disimpan dengan objek. Kami sarankan selalu menentukan algoritma CreateMultipartUpload untuk memastikan checksum Anda divalidasi dan disimpan.

Menggunakan checksum tingkat bagian untuk unggahan multipart

Ketika objek diunggah ke Amazon S3, objek tersebut dapat diunggah sebagai objek tunggal atau diunggah dalam beberapa bagian dengan proses unggahan multipart. Anda dapat memilih jenis Checksum untuk unggahan multipart Anda. Untuk checksum tingkat bagian upload multipart (atau checksum gabungan), Amazon S3 menghitung checksum untuk setiap bagian individual dengan menggunakan algoritma checksum yang ditentukan. Anda dapat menggunakan UploadPart untuk memberikan nilai checksum untuk setiap bagian. Jika objek yang Anda coba unggah di konsol Amazon S3 diatur untuk menggunakan algoritma checksum CRC-64/NVME (CRC64NVME) dan melebihi 16 MB, objek tersebut secara otomatis ditetapkan sebagai checksum objek penuh.

Amazon S3 kemudian menggunakan nilai checksum tingkat bagian yang disimpan untuk mengonfirmasi bahwa setiap bagian diunggah dengan benar. Ketika checksum setiap bagian (untuk seluruh objek) disediakan, S3 menggunakan nilai checksum yang disimpan dari setiap bagian untuk menghitung checksum objek lengkap secara internal, membandingkannya dengan nilai checksum yang disediakan. Ini meminimalkan biaya komputasi karena S3 dapat menghitung checksum dari seluruh objek menggunakan checksum bagian. Untuk informasi selengkapnya tentang unggahan multipart, lihat Mengunggah dan menyalin objek menggunakan unggahan multipart di Amazon S3 dan. Menggunakan checksum objek penuh untuk unggahan multipart

Ketika objek sepenuhnya diunggah, Anda dapat menggunakan checksum akhir yang dihitung untuk memverifikasi integritas data objek.

Saat mengunggah bagian dari unggahan multipart, perhatikan hal-hal berikut:

  • Untuk mengambil informasi tentang objek, termasuk berapa banyak bagian yang membentuk seluruh objek, Anda dapat menggunakan GetObjectAttributes operasi. Dengan checksum tambahan, Anda juga dapat memulihkan informasi untuk setiap bagian individu yang menyertakan nilai checksum bagian tersebut.

  • Untuk unggahan selesai, Anda bisa mendapatkan checksum bagian individual dengan menggunakan HeadObject operasi GetObject atau dan menentukan nomor bagian atau rentang byte yang sejajar dengan satu bagian. Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian unggahan multibagian yang masih berlangsung, Anda dapat menggunakannya. ListParts

  • Oleh karena cara Amazon S3 menghitung checksum untuk objek multibagian, nilai checksum untuk objek mungkin berubah jika Anda menyalinnya. Jika Anda menggunakan SDK atau REST API dan memanggil CopyObject, Amazon S3 menyalin objek apa pun hingga batasan ukuran operasi CopyObject API. Amazon S3 melakukan penyalinan ini sebagai tindakan tunggal, terlepas dari apakah objek diunggah dalam satu permintaan atau sebagai bagian dari unggahan multibagian. Dengan perintah salin, checksum objek adalah checksum langsung dari objek penuh. Jika objek awalnya diunggah menggunakan unggahan multipart, nilai checksum berubah meskipun data tidak berubah.

  • Objek yang lebih besar dari batasan ukuran operasi CopyObject API harus menggunakan perintah salin unggah multipart.

  • Saat Anda melakukan beberapa operasi menggunakan Konsol Manajemen AWS, Amazon S3 menggunakan unggahan multipart jika objek berukuran lebih besar dari 16 MB.

Metode checksum

Setelah mengunggah objek, Anda bisa mendapatkan nilai checksum dan membandingkannya dengan nilai checksum yang telah dihitung sebelumnya atau disimpan sebelumnya dari jenis algoritma checksum yang sama. Contoh berikut menunjukkan metode perhitungan checksum mana yang dapat Anda gunakan untuk memverifikasi integritas data.

Untuk mempelajari lebih lanjut tentang menggunakan konsol dan menentukan algoritma checksum yang akan digunakan saat mengunggah objek, lihat Mengunggah Objek dan Tutorial: Memeriksa integritas data di Amazon S3 dengan checksum tambahan.

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan AWS SDK untuk mengunggah file besar dengan upload multipart, mengunduh file besar, dan memvalidasi file upload multipart, semua dengan menggunakan SHA-256 untuk validasi file.

Java
contoh Contoh: Mengunggah, mengunduh, dan memverifikasi file besar dengan SHA-256

Untuk petunjuk tentang membuat dan menguji sampel yang berfungsi, lihat Memulai di Panduan Peng AWS SDK untuk Java embang.

import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.AbortMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.ChecksumAlgorithm; import software.amazon.awssdk.services.s3.model.ChecksumMode; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; import software.amazon.awssdk.services.s3.model.CompletedPart; import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; import software.amazon.awssdk.services.s3.model.GetObjectAttributesRequest; import software.amazon.awssdk.services.s3.model.GetObjectAttributesResponse; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.GetObjectTaggingRequest; import software.amazon.awssdk.services.s3.model.ObjectAttributes; import software.amazon.awssdk.services.s3.model.PutObjectTaggingRequest; import software.amazon.awssdk.services.s3.model.Tag; import software.amazon.awssdk.services.s3.model.Tagging; import software.amazon.awssdk.services.s3.model.UploadPartRequest; import software.amazon.awssdk.services.s3.model.UploadPartResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Base64; import java.util.List; public class LargeObjectValidation { private static String FILE_NAME = "sample.file"; private static String BUCKET = "sample-bucket"; //Optional, if you want a method of storing the full multipart object checksum in S3. private static String CHECKSUM_TAG_KEYNAME = "fullObjectChecksum"; //If you have existing full-object checksums that you need to validate against, you can do the full object validation on a sequential upload. private static String SHA256_FILE_BYTES = "htCM5g7ZNdoSw8bN/mkgiAhXt5MFoVowVg+LE9aIQmI="; //Example Chunk Size - this must be greater than or equal to 5MB. private static int CHUNK_SIZE = 5 * 1024 * 1024; public static void main(String[] args) { S3Client s3Client = S3Client.builder() .region(Region.US_EAST_1) .credentialsProvider(new AwsCredentialsProvider() { @Override public AwsCredentials resolveCredentials() { return new AwsCredentials() { @Override public String accessKeyId() { return Constants.ACCESS_KEY; } @Override public String secretAccessKey() { return Constants.SECRET; } }; } }) .build(); uploadLargeFileBracketedByChecksum(s3Client); downloadLargeFileBracketedByChecksum(s3Client); validateExistingFileAgainstS3Checksum(s3Client); } public static void uploadLargeFileBracketedByChecksum(S3Client s3Client) { System.out.println("Starting uploading file validation"); File file = new File(FILE_NAME); try (InputStream in = new FileInputStream(file)) { MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder() .bucket(BUCKET) .key(FILE_NAME) .checksumAlgorithm(ChecksumAlgorithm.SHA256) .build(); CreateMultipartUploadResponse createdUpload = s3Client.createMultipartUpload(createMultipartUploadRequest); List<CompletedPart> completedParts = new ArrayList<CompletedPart>(); int partNumber = 1; byte[] buffer = new byte[CHUNK_SIZE]; int read = in.read(buffer); while (read != -1) { UploadPartRequest uploadPartRequest = UploadPartRequest.builder() .partNumber(partNumber).uploadId(createdUpload.uploadId()).key(FILE_NAME).bucket(BUCKET).checksumAlgorithm(ChecksumAlgorithm.SHA256).build(); UploadPartResponse uploadedPart = s3Client.uploadPart(uploadPartRequest, RequestBody.fromByteBuffer(ByteBuffer.wrap(buffer, 0, read))); CompletedPart part = CompletedPart.builder().partNumber(partNumber).checksumSHA256(uploadedPart.checksumSHA256()).eTag(uploadedPart.eTag()).build(); completedParts.add(part); sha256.update(buffer, 0, read); read = in.read(buffer); partNumber++; } String fullObjectChecksum = Base64.getEncoder().encodeToString(sha256.digest()); if (!fullObjectChecksum.equals(SHA256_FILE_BYTES)) { //Because the SHA256 is uploaded after the part is uploaded; the upload is bracketed and the full object can be fully validated. s3Client.abortMultipartUpload(AbortMultipartUploadRequest.builder().bucket(BUCKET).key(FILE_NAME).uploadId(createdUpload.uploadId()).build()); throw new IOException("Byte mismatch between stored checksum and upload, do not proceed with upload and cleanup"); } CompletedMultipartUpload completedMultipartUpload = CompletedMultipartUpload.builder().parts(completedParts).build(); CompleteMultipartUploadResponse completedUploadResponse = s3Client.completeMultipartUpload( CompleteMultipartUploadRequest.builder().bucket(BUCKET).key(FILE_NAME).uploadId(createdUpload.uploadId()).multipartUpload(completedMultipartUpload).build()); Tag checksumTag = Tag.builder().key(CHECKSUM_TAG_KEYNAME).value(fullObjectChecksum).build(); //Optionally, if you need the full object checksum stored with the file; you could add it as a tag after completion. s3Client.putObjectTagging(PutObjectTaggingRequest.builder().bucket(BUCKET).key(FILE_NAME).tagging(Tagging.builder().tagSet(checksumTag).build()).build()); } catch (IOException | NoSuchAlgorithmException e) { e.printStackTrace(); } GetObjectAttributesResponse objectAttributes = s3Client.getObjectAttributes(GetObjectAttributesRequest.builder().bucket(BUCKET).key(FILE_NAME) .objectAttributes(ObjectAttributes.OBJECT_PARTS, ObjectAttributes.CHECKSUM).build()); System.out.println(objectAttributes.objectParts().parts()); System.out.println(objectAttributes.checksum().checksumSHA256()); } public static void downloadLargeFileBracketedByChecksum(S3Client s3Client) { System.out.println("Starting downloading file validation"); File file = new File("DOWNLOADED_" + FILE_NAME); try (OutputStream out = new FileOutputStream(file)) { GetObjectAttributesResponse objectAttributes = s3Client.getObjectAttributes(GetObjectAttributesRequest.builder().bucket(BUCKET).key(FILE_NAME) .objectAttributes(ObjectAttributes.OBJECT_PARTS, ObjectAttributes.CHECKSUM).build()); //Optionally if you need the full object checksum, you can grab a tag you added on the upload List<Tag> objectTags = s3Client.getObjectTagging(GetObjectTaggingRequest.builder().bucket(BUCKET).key(FILE_NAME).build()).tagSet(); String fullObjectChecksum = null; for (Tag objectTag : objectTags) { if (objectTag.key().equals(CHECKSUM_TAG_KEYNAME)) { fullObjectChecksum = objectTag.value(); break; } } MessageDigest sha256FullObject = MessageDigest.getInstance("SHA-256"); MessageDigest sha256ChecksumOfChecksums = MessageDigest.getInstance("SHA-256"); //If you retrieve the object in parts, and set the ChecksumMode to enabled, the SDK will automatically validate the part checksum for (int partNumber = 1; partNumber <= objectAttributes.objectParts().totalPartsCount(); partNumber++) { MessageDigest sha256Part = MessageDigest.getInstance("SHA-256"); ResponseInputStream<GetObjectResponse> response = s3Client.getObject(GetObjectRequest.builder().bucket(BUCKET).key(FILE_NAME).partNumber(partNumber).checksumMode(ChecksumMode.ENABLED).build()); GetObjectResponse getObjectResponse = response.response(); byte[] buffer = new byte[CHUNK_SIZE]; int read = response.read(buffer); while (read != -1) { out.write(buffer, 0, read); sha256FullObject.update(buffer, 0, read); sha256Part.update(buffer, 0, read); read = response.read(buffer); } byte[] sha256PartBytes = sha256Part.digest(); sha256ChecksumOfChecksums.update(sha256PartBytes); //Optionally, you can do an additional manual validation again the part checksum if needed in addition to the SDK check String base64PartChecksum = Base64.getEncoder().encodeToString(sha256PartBytes); String base64PartChecksumFromObjectAttributes = objectAttributes.objectParts().parts().get(partNumber - 1).checksumSHA256(); if (!base64PartChecksum.equals(getObjectResponse.checksumSHA256()) || !base64PartChecksum.equals(base64PartChecksumFromObjectAttributes)) { throw new IOException("Part checksum didn't match for the part"); } System.out.println(partNumber + " " + base64PartChecksum); } //Before finalizing, do the final checksum validation. String base64FullObject = Base64.getEncoder().encodeToString(sha256FullObject.digest()); String base64ChecksumOfChecksums = Base64.getEncoder().encodeToString(sha256ChecksumOfChecksums.digest()); if (fullObjectChecksum != null && !fullObjectChecksum.equals(base64FullObject)) { throw new IOException("Failed checksum validation for full object"); } System.out.println(fullObjectChecksum); String base64ChecksumOfChecksumFromAttributes = objectAttributes.checksum().checksumSHA256(); if (base64ChecksumOfChecksumFromAttributes != null && !base64ChecksumOfChecksums.equals(base64ChecksumOfChecksumFromAttributes)) { throw new IOException("Failed checksum validation for full object checksum of checksums"); } System.out.println(base64ChecksumOfChecksumFromAttributes); out.flush(); } catch (IOException | NoSuchAlgorithmException e) { //Cleanup bad file file.delete(); e.printStackTrace(); } } public static void validateExistingFileAgainstS3Checksum(S3Client s3Client) { System.out.println("Starting existing file validation"); File file = new File("DOWNLOADED_" + FILE_NAME); GetObjectAttributesResponse objectAttributes = s3Client.getObjectAttributes(GetObjectAttributesRequest.builder().bucket(BUCKET).key(FILE_NAME) .objectAttributes(ObjectAttributes.OBJECT_PARTS, ObjectAttributes.CHECKSUM).build()); try (InputStream in = new FileInputStream(file)) { MessageDigest sha256ChecksumOfChecksums = MessageDigest.getInstance("SHA-256"); MessageDigest sha256Part = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[CHUNK_SIZE]; int currentPart = 0; int partBreak = objectAttributes.objectParts().parts().get(currentPart).size(); int totalRead = 0; int read = in.read(buffer); while (read != -1) { totalRead += read; if (totalRead >= partBreak) { int difference = totalRead - partBreak; byte[] partChecksum; if (totalRead != partBreak) { sha256Part.update(buffer, 0, read - difference); partChecksum = sha256Part.digest(); sha256ChecksumOfChecksums.update(partChecksum); sha256Part.reset(); sha256Part.update(buffer, read - difference, difference); } else { sha256Part.update(buffer, 0, read); partChecksum = sha256Part.digest(); sha256ChecksumOfChecksums.update(partChecksum); sha256Part.reset(); } String base64PartChecksum = Base64.getEncoder().encodeToString(partChecksum); if (!base64PartChecksum.equals(objectAttributes.objectParts().parts().get(currentPart).checksumSHA256())) { throw new IOException("Part checksum didn't match S3"); } currentPart++; System.out.println(currentPart + " " + base64PartChecksum); if (currentPart < objectAttributes.objectParts().totalPartsCount()) { partBreak += objectAttributes.objectParts().parts().get(currentPart - 1).size(); } } else { sha256Part.update(buffer, 0, read); } read = in.read(buffer); } if (currentPart != objectAttributes.objectParts().totalPartsCount()) { currentPart++; byte[] partChecksum = sha256Part.digest(); sha256ChecksumOfChecksums.update(partChecksum); String base64PartChecksum = Base64.getEncoder().encodeToString(partChecksum); System.out.println(currentPart + " " + base64PartChecksum); } String base64CalculatedChecksumOfChecksums = Base64.getEncoder().encodeToString(sha256ChecksumOfChecksums.digest()); System.out.println(base64CalculatedChecksumOfChecksums); System.out.println(objectAttributes.checksum().checksumSHA256()); if (!base64CalculatedChecksumOfChecksums.equals(objectAttributes.checksum().checksumSHA256())) { throw new IOException("Full object checksum of checksums don't match S3"); } } catch (IOException | NoSuchAlgorithmException e) { e.printStackTrace(); } } }

Anda dapat mengirim permintaan REST untuk mengunggah objek dengan nilai checksum untuk memverifikasi integritas data. PutObject Anda juga dapat mengambil nilai checksum untuk objek menggunakan GetObject atau HeadObject.

Anda dapat mengirim permintaan PUT untuk mengunggah objek hingga 5 GB dalam satu operasi. Untuk informasi selengkapnya, lihat PutObject di Referensi Perintah AWS CLI . Anda juga dapat menggunakan get-object dan head-object untuk mengambil checksum dari objek yang sudah diunggah guna memverifikasi integritas data.

Untuk informasi, lihat FAQ Amazon S3 CLI di Panduan AWS Command Line Interface Pengguna.

Menggunakan Content-MD5 saat mengunggah objek

Cara lain untuk memverifikasi integritas objek Anda setelah diunggah adalah dengan memberikan intisari MD5 objek saat Anda mengunggahnya. Jika Anda menghitung intisari MD5 untuk objek Anda, Anda dapat memberikan intisari dengan perintah PUT menggunakan header Content-MD5.

Setelah mengunggah objek, Amazon S3 menghitung intisari MD5 objek dan membandingkannya dengan nilai yang Anda berikan. Permintaan hanya berhasil jika kedua intisari cocok.

Menyediakan intisari MD5 tidak diperlukan, tetapi Anda dapat menggunakannya untuk memverifikasi integritas objek sebagai bagian dari proses pengunggahan.

Menggunakan Content-MD5 dan ETag untuk memverifikasi objek yang diunggah

Tag entitas (ETag) untuk sebuah objek mewakili versi objek tertentu. Perlu diingat bahwa ETag hanya mencerminkan perubahan pada konten objek, bukan perubahan pada metadatanya. Jika hanya metadata objek yang berubah, maka ETag-nya tetap sama.

Tergantung pada objeknya, ETag dari objek mungkin rangkuman MD5 dari data objek:

  • Jika objek dibuat oleh,, atau CopyObject operasi PutObjectPostObject, atau melalui Konsol Manajemen AWS, dan objek tersebut juga berupa plaintext atau dienkripsi oleh enkripsi sisi server dengan kunci terkelola Amazon S3 (SSE-S3), objek tersebut memiliki ETag yang merupakan ringkasan MD5 dari data objeknya.

  • Jika objek dibuat oleh,, atau CopyObject operasi PutObjectPostObject, atau melalui Konsol Manajemen AWS, dan objek itu dienkripsi dengan enkripsi sisi server dengan kunci () yang disediakan pelanggan atau enkripsi sisi server dengan (SSE-C) keys AWS Key Management Service (AWS KMS SSE-KMS), objek tersebut memiliki ETag yang bukan merupakan ringkasan MD5 dari data objeknya.

  • Jika objek dibuat oleh proses upload multipart atau UploadPartCopy operasi, ETag objek bukanlah ringkasan MD5, terlepas dari metode enkripsi. Jika objek lebih besar dari 16 MB, objek tersebut akan mengunggah atau menyalin objek tersebut sebagai ungg Konsol Manajemen AWS ahan multipart, dan oleh karena itu ETag bukan ringkasan MD5.

Untuk objek di mana ETag adalah intisari Content-MD5 objek, Anda dapat membandingkan nilai ETag objek dengan intisari Content-MD5 yang dihitung atau disimpan sebelumnya.

Menggunakan checksum trailing

Saat mengunggah objek besar ke Amazon S3, Anda dapat memberikan checksum yang telah dihitung sebelumnya untuk objek atau menggunakan AWS SDK untuk secara otomatis membuat checksum terakhir untuk unggahan dalam potongan, atas nama Anda. Jika Anda menggunakan checksum terakhir, Amazon S3 secara otomatis menghasilkan nilai checksum dengan menggunakan algoritma yang Anda tentukan untuk memvalidasi integritas objek dalam unggahan berpotongan, saat Anda mengunggah objek.

Untuk membuat checksum tambahan saat menggunakan AWS SDK, isi ChecksumAlgorithm parameter dengan algoritma pilihan Anda. SDK menggunakan algoritma itu untuk menghitung nilai checksum untuk objek Anda (atau bagian objek) dan secara otomatis menambahkannya ke akhir permintaan unggahan berpotongan Anda. Perilaku ini menghemat waktu Anda, sebab Amazon S3 melakukan verifikasi dan pengunggahan data Anda dalam sekali jalan.

penting

Jika Anda menggunakan S3 Lambda Objek, semua permintaan ke S3 Lambda Objek ditandatangani menggunakan, s3-object-lambda dan bukan s3. Perilaku ini memengaruhi tanda tangan nilai checksum trailing. Untuk informasi selengkapnya tentang S3 Lambda Objek, lihat Mengubah objek dengan S3 Lambda Objek.

Header checksum yang tertinggal

Untuk membuat permintaan pengkodean konten terpotong, Amazon S3 mengharuskan server klien menyertakan beberapa header untuk mengurai permintaan dengan benar. Server klien harus menyertakan header berikut:

  • x-amz-decoded-content-length: Header ini menunjukkan ukuran plaintext dari data aktual yang sedang diunggah ke Amazon S3 dengan permintaan.

  • x-amz-content-sha256: Header ini menunjukkan jenis unggahan potongan yang disertakan dalam permintaan. Untuk unggahan dalam potongan dengan checksum terakhir, nilai header adalah STREAMING-UNSIGNED-PAYLOAD-TRAILER untuk permintaan yang tidak menggunakan penandatanganan payload dan STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER untuk permintaan yang menggunakan penandatanganan payload SIGv4. (Untuk informasi selengkapnya tentang menerapkan payload yang ditandatangani, lihat Perhitungan tanda tangan untuk header otorisasi: Mentransfer payload dalam beberapa bagian.)

  • x-amz-trailer: Header ini menunjukkan nama header trailing dalam permintaan. Jika checksum trailing ada (di mana AWS SDK menambahkan checksum ke badan permintaan yang dikodekan), nilai x-amz-trailer header menyertakan x-amz-checksum- awalan dan diakhiri dengan nama algoritma. Nilai- x-amz-trailer nilai berikut saat ini didukung:

    • x-amz-checksum-crc32

    • x-amz-checksum-crc32c

    • x-amz-checksum-crc64nvme

    • x-amz-checksum-sha1

    • x-amz-checksum-sha256

catatan

Anda juga dapat menyertakan Content-Encoding header, dengan nilai yang dipotong, dalam permintaan Anda. Meskipun header ini tidak diperlukan, termasuk header ini dapat meminimalkan masalah proxy HTTP saat mengirimkan data yang dikodekan. Jika Content-Encoding header lain (seperti gzip) ada dalam permintaan, Content-Encoding header menyertakan nilai yang dipotong dalam daftar pengkodean yang dipisahkan koma. Misalnya, Content-Encoding: aws-chunked, gzip.

Bagian yang dipotong-potong

Saat Anda mengunggah objek ke Amazon S3 menggunakan pengkodean chunked, permintaan upload menyertakan jenis potongan berikut (diformat dalam urutan yang tercantum):

  • Potongan tubuh objek: Mungkin ada satu, beberapa, atau nol potongan tubuh yang terkait dengan permintaan unggahan berpotongan.

  • Potongan penyelesaian: Mungkin ada satu, beberapa, atau nol potongan tubuh yang terkait dengan permintaan unggahan berpotongan.

  • Potongan akhir: Checksum terakhir terdaftar setelah potongan penyelesaian. Hanya satu potongan trailing yang diperbolehkan.

catatan

Setiap unggahan yang dipotong harus diakhiri dengan CRLF akhir (seperti\r\n) untuk menunjukkan akhir permintaan.

Untuk contoh pemformatan berpotongan, lihatContoh: Upload berpotongan dengan checksum di belakang.

Potongan tubuh objek

Potongan tubuh objek adalah potongan yang berisi data objek aktual yang sedang diunggah ke S3. Potongan ini memiliki batasan ukuran dan format yang konsisten.

Ukuran potongan tubuh objek

Potongan ini harus berisi setidaknya 8.192 byte (atau 8 KiB) data objek, kecuali untuk potongan tubuh akhir, yang bisa lebih kecil. Tidak ada ukuran potongan maksimum eksplisit tetapi Anda dapat mengharapkan semua potongan menjadi lebih kecil dari ukuran unggahan maksimum 5 GB. Ukuran potongan dapat bervariasi dari satu potongan ke potongan berikutnya berdasarkan implementasi server klien Anda.

Format potongan tubuh objek

Potongan tubuh objek dimulai dengan pengkodean heksadesimal dari jumlah byte dalam potongan tubuh objek, diikuti oleh CRLF (Carriage Return Line Feed), byte objek untuk potongan itu, dan CRLF lainnya.

Contoh:

hex-encoding-of-object-bytes-in-chunk\r\n chunk-object-bytes\r\n

Namun, ketika potongan ditandatangani, potongan tubuh objek mengikuti format yang berbeda, di mana tanda tangan ditambahkan ke ukuran potongan dengan pembatas titik koma. Contoh:

hex-encoding-of-object-bytes-in-chunk;chunk-signature\r\n chunk-object-bytes\r\n

Untuk informasi selengkapnya tentang penandatanganan potongan, lihat Perhitungan tanda tangan untuk Authorization Header: Mentransfer muatan dalam beberapa potongan (Tanda Tangan Versi AWS 4). Untuk informasi selengkapnya tentang pemformatan potongan, lihat Pengkodean transfer Chunked di situs web Editor RFC.

Potongan penyelesaian

Potongan penyelesaian harus menjadi potongan tubuh objek terakhir dari setiap unggahan potongan. Format potongan penyelesaian mirip dengan body chunk, tetapi selalu berisi nol byte data objek. (Nol byte data objek menunjukkan bahwa semua data telah diunggah.) Upload berpotongan harus menyertakan potongan penyelesaian sebagai potongan tubuh objek terakhirnya, mengikuti format seperti ini:

0\r\n

Namun, jika permintaan pengkodean konten menggunakan penandatanganan muatan, itu mengikuti format ini sebagai gantinya:

0;chunk-signature\r\n

Potongan trailer

Potongan trailer menyimpan checksum yang dihitung untuk semua permintaan unggahan S3. Potongan trailer mencakup dua bidang: satu bidang nama header dan satu bidang nilai header. Bidang nama header untuk permintaan upload harus sesuai dengan nilai yang diteruskan ke header x-amz-trailer permintaan. Misalnya, jika permintaan berisi x-amz-trailer: x-amz-checksum-crc32 dan potongan trailer memiliki nama headerx-amz-checksum-sha1, permintaan gagal. Bidang nilai dalam potongan trailer menyertakan pengkodean base64 dari nilai checksum big-endian untuk objek itu. (Urutan big-endian menyimpan byte data paling signifikan pada alamat memori terendah, dan byte paling tidak signifikan pada alamat memori terbesar). Algoritma yang digunakan untuk menghitung checksum ini sama dengan akhiran untuk nama header (misalnya,crc32).

Format potongan trailer

Potongan trailer menggunakan format berikut untuk permintaan muatan yang tidak ditandatangani:

x-amz-checksum-lowercase-checksum-algorithm-name:base64-checksum-value\n\r\n\r\n

Untuk permintaan dengan mu atan yang ditandatangani SIGv4, potongan trailer menyertakan tanda tangan trailer setelah potongan trailer.

trailer-checksum\n\r\n trailer-signature\r\n

Anda juga dapat menambahkan CRLF langsung ke akhir nilai checksum base64. Contoh:

x-amz-checksum-lowercase-checksum-algorithm-name:base64-checksum-value\r\n\r\n

Contoh: Upload berpotongan dengan checksum di belakang

Amazon S3 mendukung unggahan dalam potongan yang menggunakan pengkodean aws-chunked konten untuk PutObject dan UploadPart permintaan dengan checksum tambahan.

contoh 1 — Permintaan chunked yang tidak ditandatangani dengan PutObject checksum di belakang CRC-32

Berikut ini adalah contoh PutObject permintaan chunked dengan checksum di belakang. CRC-32 Dalam contoh ini, klien mengunggah objek 17 KB dalam tiga potongan yang tidak ditandatangani dan menambahkan potongan CRC-32 checksum di belakang dengan menggunakan header. x-amz-checksum-crc32

PUT /Key+ HTTP/1.1 Host: amzn-s3-demo-bucket Content-Encoding: aws-chunked x-amz-decoded-content-length: 17408 x-amz-content-sha256: STREAMING-UNSIGNED-PAYLOAD-TRAILER x-amz-trailer: x-amz-checksum-crc32 2000\r\n // Object body chunk 1 (8192 bytes) object-bytes\r\n 2000\r\n // Object body chunk 2 (8192 bytes) object-bytes\r\n 400\r\n // Object body chunk 3 (1024 bytes) object-bytes\r\n 0\r\n // Completion chunk x-amz-checksum-crc32:YABb/g==\n\r\n\r\n // Trailer chunk (note optional \n character) \r\n // CRLF

Berikut adalah contoh tanggapan:

HTTP/1.1 200 ETag: ETag x-amz-checksum-crc32: YABb/g==
catatan

Penggunaan linefeed \n di akhir nilai checksum mungkin bervariasi antar klien.

contoh 2 — PutObject permintaan SigV4-signed terpotong dengan checksum trailing CRC-32 (CRC 32)

Berikut ini adalah contoh PutObject permintaan chunked dengan checksum di belakang. CRC-32 Permintaan ini menggunakan penandatanganan muatan SIGv4. Dalam contoh ini, klien mengunggah objek 17 KB dalam tiga potongan yang ditandatangani. Selain potongan object body -potongan, completion chunk dan juga trailer chunk ditandatangani.

PUT /Key+ HTTP/1.1 Host: amzn-s3-demo-bucket.s3.amazonaws.com Content-Encoding: aws-chunked x-amz-decoded-content-length: 17408 x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER x-amz-trailer: x-amz-checksum-crc32 authorization-code // SigV4 headers authorization 2000;chunk-signature=signature-value...\r\n // Object body chunk 1 (8192 bytes) object-bytes\r\n 2000;chunk-signature\r\n // Object body chunk 2 (8192 bytes) object-bytes\r\n 400;chunk-signature\r\n // Object body chunk 3 (1024 bytes) object-bytes\r\n 0;chunk-signature\r\n // Completion chunk x-amz-checksum-crc32:YABb/g==\n\r\n // Trailer chunk (note optional \n character) trailer-signature\r\n \r\n // CRLF

Berikut adalah contoh tanggapan:

HTTP/1.1 200 ETag: ETag x-amz-checksum-crc32: YABb/g==