Memeriksa integritas objek 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 di Amazon S3

Amazon S3 menggunakan nilai checksum untuk memverifikasi integritas data yang Anda unggah atau unduh. Selain itu, Anda dapat meminta agar nilai checksum lain dihitung untuk objek apa pun yang Anda simpan di Amazon S3. Anda dapat memilih algoritma checksum yang akan digunakan saat mengunggah, menyalin, atau menyalin data secara batch.

Saat mengunggah data, Amazon S3 menggunakan algoritme yang Anda pilih untuk menghitung checksum di sisi server dan memvalidasinya dengan nilai yang diberikan sebelum menyimpan objek dan menyimpan checksum sebagai bagian dari metadata objek. Validasi ini bekerja secara konsisten di seluruh mode enkripsi, ukuran objek, dan kelas penyimpanan untuk unggahan satu bagian dan multibagian. Namun, ketika Anda menyalin atau menyalin data secara batch, Amazon S3 menghitung checksum pada objek sumber dan memindahkannya ke objek tujuan.

catatan

Saat Anda melakukan unggahan satu bagian atau multibagian, Anda dapat secara opsional menyertakan checksum yang telah dihitung sebelumnya sebagai bagian dari permintaan Anda, dan menggunakan jenis checksum objek lengkap. Untuk menggunakan nilai yang telah dihitung sebelumnya dengan beberapa objek, gunakan AWS CLI atau AWS SDKs.

Menggunakan algoritma checksum yang didukung

Dengan Amazon S3, Anda dapat memilih algoritma checksum untuk memvalidasi data Anda selama pengunggahan. 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

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

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

  • Saat Anda menggunakan AWS Management Console, 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 berikut:

    • Atur ChecksumAlgorithm parameter ke algoritme yang Anda inginkan Amazon S3 gunakan. 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 meneruskan 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 set algoritma checksum, Amazon S3 gagal permintaan dengan kesalahan. BadDigest

    • Jika Anda menggunakan SDK yang ditingkatkan, AWS SDK akan 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 parameternya. Sebagai gantinya, gunakan salah satu header khusus algoritme (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 tertentu, Amazon S3 menggunakan algoritma CRC-64/NVME untuk menghitung nilai checksum untuk objek tujuan. Anda juga dapat menentukan algoritma checksum saat menyalin objek menggunakan Operasi Batch S3.

penting

Jika Anda menggunakan unggahan multibagian dengan Checksum untuk checksum komposit (atau tingkat bagian), nomor bagian unggahan multibagian harus berurutan. Jika Anda mencoba menyelesaikan permintaan unggahan multibagian dengan nomor bagian yang tidak berurutan, Amazon S3 menghasilkan kesalahan. HTTP 500 Internal Server

Objek lengkap dan jenis checksum komposit

Di Amazon S3, ada dua jenis checksum yang didukung:

  • Checksum objek lengkap: Checksum objek lengkap dihitung berdasarkan semua konten unggahan multipart, yang mencakup semua data dari byte pertama bagian pertama hingga byte terakhir dari bagian terakhir.

    catatan

    Semua permintaan PUT memerlukan jenis checksum objek lengkap.

  • Checksum komposit: Checksum komposit dihitung berdasarkan checksum individual dari setiap bagian dalam unggahan multibagian. 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.

    catatan

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

Amazon S3 mendukung objek lengkap berikut dan jenis algoritma checksum komposit:

  • CRC-64/NVME (CRC64NVME): Mendukung tipe algoritma objek lengkap saja.

  • CRC-32 (CRC32): Mendukung objek penuh dan jenis algoritma komposit.

  • CRC-32C (CRC32C): Mendukung objek penuh dan jenis algoritma komposit.

  • SHA-1 (SHA1): Mendukung objek penuh dan jenis algoritma komposit.

  • SHA-256 (SHA256): Mendukung objek penuh dan jenis algoritma komposit.

Unggahan satu bagian

Checksum objek yang diunggah dalam satu bagian (menggunakan PutObject) diperlakukan sebagai checksum objek lengkap. 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 checksum ini sebelum menyimpan objek dan nilai checksum-nya. Anda dapat memverifikasi integritas data objek saat meminta nilai checksum selama pengunduhan objek.

Unggahan multipart

Saat mengunggah objek di beberapa bagian menggunakan MultipartUploadAPI, Anda dapat menentukan algoritma checksum yang ingin digunakan Amazon S3 dan jenis checksum (objek lengkap atau komposit).

Tabel berikut menunjukkan jenis algoritma checksum 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

Menggunakan checksum objek lengkap untuk unggahan multipart

Saat membuat atau melakukan unggahan multibagian, Anda dapat menggunakan checksum objek lengkap untuk validasi saat diunggah. Ini berarti Anda dapat menyediakan algoritme checksum untuk MultipartUploadAPI, menyederhanakan alat validasi integritas karena Anda tidak perlu lagi melacak batas bagian untuk objek yang diunggah. Anda dapat memberikan checksum seluruh objek dalam CompleteMultipartUploadpermintaan, bersama dengan ukuran objek.

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

Untuk checksum objek lengkap, Anda dapat menggunakan algoritma checksum CRC-64/NVME (CRC64NVME), CRC-32 (), atau CRC-32C (CRC32) di S3. CRC32C Checksum objek lengkap dalam unggahan multibagian hanya tersedia untuk checksum berbasis CRC karena mereka dapat linier menjadi checksum objek lengkap. Linearisasi ini memungkinkan Amazon S3 untuk memparalelkan permintaan Anda untuk meningkatkan 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 objek penuh CRC-64/NVME () yang direkomendasikan ke objek. CRC64NVME

catatan

Untuk memulai unggahan multipart, Anda dapat menentukan algoritma checksum dan jenis checksum objek lengkap. Setelah Anda menentukan algoritma checksum dan jenis checksum objek lengkap, Anda dapat memberikan nilai checksum objek lengkap untuk unggahan multipart.

Menggunakan checksum tingkat suku cadang untuk unggahan multipart

Ketika objek diunggah ke Amazon S3, mereka dapat diunggah sebagai objek tunggal atau diunggah dalam beberapa bagian dengan proses pengunggahan multibagian. Anda dapat memilih jenis Checksum untuk unggahan multipart Anda. Untuk checksum tingkat suku cadang unggahan multibagian (atau checksum komposit), Amazon S3 menghitung checksum untuk setiap bagian individual dengan menggunakan algoritma checksum yang ditentukan. Anda dapat menggunakan UploadPartuntuk 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 lengkap.

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 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 lengkap untuk unggahan multipart

Ketika objek benar-benar diunggah, Anda dapat menggunakan checksum terhitung akhir 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 GetObjectAttributesoperasi. Dengan checksum tambahan, Anda juga dapat memulihkan informasi untuk setiap bagian individual yang menyertakan nilai checksum bagian tersebut.

  • Untuk upload selesai, Anda bisa mendapatkan checksum bagian individual dengan menggunakan HeadObjectoperasi GetObjectatau dan menentukan nomor bagian atau rentang byte yang sejajar dengan satu bagian. Jika Anda ingin mengambil nilai checksum untuk masing-masing bagian dari 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 menelepon CopyObject, Amazon S3 menyalin objek apa pun hingga batasan ukuran CopyObject operasi 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 multibagian, nilai checksum berubah meskipun datanya tidak.

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

  • Saat Anda melakukan beberapa operasi menggunakan AWS Management Console, Amazon S3 menggunakan unggahan multibagian jika objek berukuran lebih besar dari 16 MB.

Operasi Checksum

Setelah mengunggah objek, Anda bisa mendapatkan nilai checksum dan membandingkannya dengan nilai checksum yang telah dihitung sebelumnya atau disimpan sebelumnya dari jenis algoritma yang sama. Contoh berikut menunjukkan operasi atau metode 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 SDKs untuk meng-upload file besar dengan upload multipart, men-download file besar, dan memvalidasi file upload multipart, semua dengan menggunakan SHA-256 untuk validasi file.

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

Untuk petunjuk cara membuat dan menguji sampel yang berfungsi, lihat Memulai di Panduan AWS SDK for Java Pengembang.

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 dengan PutObject. Anda juga dapat mengambil nilai checksum untuk objek yang menggunakan GetObjectatau. 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 selengkapnya, lihat FAQ Amazon S3 CLI di Panduan Pengguna.AWS Command Line Interface

Menggunakan Konten- MD5 saat mengunggah objek

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

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

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

Menggunakan Konten- MD5 dan ETag untuk memverifikasi objek yang diunggah

Tag entitas (ETag) untuk objek mewakili versi tertentu dari objek tersebut. Perlu diingat bahwa ETag satu-satunya mencerminkan perubahan pada konten objek, bukan perubahan metadatanya. Jika hanya metadata suatu objek yang berubah, ETag tetap sama.

Tergantung pada objek, objek mungkin merupakan MD5 intisari dari data objek: ETag

  • Jika objek dibuat oleh,, atau CopyObject operasi PutObjectPostObject, atau melalui AWS Management Console, dan objek itu juga teks biasa atau dienkripsi oleh enkripsi sisi server dengan kunci terkelola Amazon S3 (SSE-S3), objek tersebut memiliki intisari data objeknya. ETag MD5

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

  • Jika objek dibuat oleh proses upload multipart atau UploadPartCopy operasi, objek ETag bukanlah MD5 intisari, terlepas dari metode enkripsi. Jika objek lebih besar dari 16 MB, AWS Management Console upload atau copy objek tersebut sebagai upload multipart, dan oleh karena itu ETag bukan MD5 intisari.

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

Menggunakan checksum trailing

Saat mengunggah objek ke Amazon S3, Anda dapat memberikan checksum yang telah dihitung sebelumnya untuk objek tersebut atau menggunakan SDK untuk secara otomatis membuat checksum AWS tambahan untuk unggahan yang dipotong, atas nama Anda. Jika Anda menggunakan checksum tambahan, Amazon S3 secara otomatis menghasilkan checksum dengan menggunakan algoritme yang ditentukan untuk memvalidasi integritas objek dalam unggahan terpotong, saat Anda mengunggah objek.

Untuk membuat checksum tambahan saat menggunakan AWS SDK, isi ChecksumAlgorithm parameter dengan algoritme pilihan Anda. SDK menggunakan algoritme tersebut untuk menghitung checksum untuk objek Anda (atau bagian objek) dan secara otomatis menambahkannya ke akhir permintaan unggahan yang terpotong. 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 tertinggal

Untuk membuat permintaan pengkodean konten yang 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 chunked yang disertakan dalam permintaan. Untuk unggahan terpotong dengan checksum tambahan, 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 penerapan payload yang ditandatangani, lihat Perhitungan tanda tangan untuk header otorisasi: Mentransfer muatan dalam beberapa potongan.)

  • x-amz-trailer: Header ini menunjukkan nama header trailing dalam permintaan. Jika checksum tambahan ada (di mana AWS SDKs menambahkan checksum ke badan permintaan yang dikodekan), nilai x-amz-trailer header menyertakan awalan dan diakhiri dengan nama algoritme. x-amz-checksum- x-amz-trailerNilai-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 chunked, dalam permintaan Anda. Meskipun header ini tidak diperlukan, termasuk header ini dapat meminimalkan masalah proxy HTTP saat mentransmisikan data yang dikodekan. Jika Content-Encoding header lain (seperti gzip) ada dalam permintaan, Content-Encoding header menyertakan nilai chunked dalam daftar pengkodean yang dipisahkan koma. Misalnya, Content-Encoding: aws-chunked, gzip.

Bagian yang terpotong

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

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

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

  • Potongan trailing: Checksum trailing terdaftar setelah potongan penyelesaian. Hanya satu potongan trailing yang diizinkan.

catatan

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

Untuk contoh pemformatan chunked, lihat. Contoh: Unggahan terpotong dengan checksum tambahan

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 lebih kecil dari ukuran unggah 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.

Sebagai 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. Sebagai 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 (Versi AWS Tanda Tangan 4). Untuk informasi selengkapnya tentang pemformatan potongan, lihat Pengkodean transfer terpotong di situs web Editor RFC.

Potongan penyelesaian

Potongan penyelesaian diperlukan untuk menjadi potongan tubuh objek terakhir dari setiap unggahan yang terpotong. Format potongan penyelesaian mirip dengan potongan tubuh, tetapi selalu berisi nol byte data objek. (Byte nol dari data objek menunjukkan bahwa semua data telah diunggah.) Unggahan terpotong harus menyertakan potongan penyelesaian sebagai potongan tubuh objek terakhirnya, mengikuti format seperti ini:

0\r\n

Namun, jika permintaan pengkodean konten menggunakan penandatanganan payload, 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 mencakup pengkodean base64 dari nilai checksum endian besar untuk objek tersebut. (Pengurutan 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 muatan 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. Sebagai contoh:

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

Contoh: Unggahan terpotong dengan checksum tambahan

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

contoh 1 — PutObject Permintaan potongan yang tidak ditandatangani dengan checksum CRC-32 tertinggal

Berikut ini adalah contoh PutObject permintaan chunked dengan checksum CRC-32 tertinggal. Dalam contoh ini, klien mengunggah objek 17 KB dalam tiga potongan yang tidak ditandatangani dan menambahkan potongan checksum CRC-32 tertinggal 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 respon:

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

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

contoh 2 — PutObject Permintaan chunked yang ditandatangani SIGV4 dengan checksum CRC-32 () tertinggal CRC32

Berikut ini adalah contoh PutObject permintaan chunked dengan checksum CRC-32 tertinggal. Permintaan ini menggunakan penandatanganan payload SiGv4. Dalam contoh ini, klien mengunggah objek 17 KB dalam tiga potongan yang ditandatangani. Selain object body potongan, completion chunk dan trailer chunk juga 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 respon:

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