

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

# Perhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Beberapa Potongan (Unggahan Terpotong) (AWS Versi Tanda Tangan 4)
<a name="sigv4-streaming"></a>

Seperti dijelaskan dalam[Gambaran umum](sigv4-auth-using-authorization-header.md#sigv4-auth-header-overview), saat mengotentikasi permintaan menggunakan `Authorization` header, Anda memiliki opsi untuk mengunggah payload dalam potongan. Anda dapat mengirim data dalam ukuran tetap atau potongan ukuran variabel. Bagian ini menjelaskan proses perhitungan tanda tangan dalam unggahan potongan, cara Anda membuat badan potongan, dan cara kerja penandatanganan tertunda di mana Anda pertama kali mengunggah potongan, dan mengirim tanda tangannya di bagian berikutnya. Bagian contoh (lihat[Contoh: Objek PUT](#example-signature-calculations-streaming)) menunjukkan perhitungan tanda tangan dan `Authorization` header hasil yang dapat Anda gunakan sebagai rangkaian pengujian untuk memverifikasi kode Anda.

 

**catatan**  
Saat mentransfer data dalam serangkaian potongan, Anda harus melakukan salah satu dari hal berikut:   
Secara eksplisit menentukan panjang konten total (panjang objek dalam byte ditambah metadata di setiap potongan) menggunakan header `Content-Length` HTTP. Untuk melakukan ini, Anda harus menghitung terlebih dahulu panjang total payload, termasuk metadata yang Anda kirim di setiap potongan, sebelum memulai permintaan Anda.
Tentukan header `Transfer-Encoding` HTTP. Jika Anda menyertakan `Transfer-Encoding` header dan menentukan nilai apa pun selain`identity`, Anda harus menghilangkan `Content-Length` header.
  
Untuk semua permintaan, Anda harus menyertakan `x-amz-decoded-content-length` header, menentukan ukuran objek dalam byte.  


Setiap perhitungan tanda tangan potongan mencakup tanda tangan dari potongan sebelumnya. Untuk memulai, Anda membuat * tanda tangan * benih hanya menggunakan header. Anda menggunakan tanda tangan benih dalam perhitungan tanda tangan dari potongan pertama. Untuk setiap potongan berikutnya, Anda membuat tanda tangan potongan yang menyertakan tanda tangan dari potongan sebelumnya. Dengan demikian, tanda tangan potongan dirantai bersama; yaitu, tanda tangan dari potongan n adalah fungsi * F (chunk * n*, signature (chunk n-1)). * Rantaian memastikan bahwa Anda mengirim potongan dalam urutan yang benar.



Untuk melakukan unggahan dalam potongan, lakukan hal berikut:

 

1. Tentukan ukuran potongan muatan. Anda membutuhkan ini ketika Anda menulis kode.

   Ukuran potongan harus minimal 8 KB. Kami merekomendasikan ukuran potongan minimal 64 KB untuk kinerja yang lebih baik. Ukuran potongan ini berlaku untuk semua potongan kecuali yang terakhir. Potongan terakhir yang Anda kirim bisa lebih kecil dari 8 KB. Jika muatan Anda kecil dan dapat masuk ke dalam satu potongan, maka itu bisa lebih kecil dari 8 KB.

1. Buat tanda tangan benih untuk dimasukkan dalam potongan pertama. Untuk informasi selengkapnya, lihat [Menghitung Tanda Tangan Benih](#sigv4-chunked-upload-sig-calculation-chunk0).

1. Buat potongan pertama dan streaming. Untuk informasi selengkapnya, lihat [Mendefinisikan Tubuh Potongan](#sigv4-chunked-body-definition).

1. Untuk setiap potongan berikutnya, hitung tanda tangan potongan yang menyertakan tanda tangan sebelumnya dalam string yang Anda tandatangani, buat potongan, dan kirimkan. Untuk informasi selengkapnya, lihat [Mendefinisikan Tubuh Potongan](#sigv4-chunked-body-definition).

1. Kirim potongan tambahan terakhir, yang sama dengan potongan lain dalam konstruksi, tetapi memiliki nol byte data. Untuk informasi selengkapnya, lihat [Mendefinisikan Tubuh Potongan](#sigv4-chunked-body-definition).

## Menghitung Tanda Tangan Benih
<a name="sigv4-chunked-upload-sig-calculation-chunk0"></a>

Diagram berikut menggambarkan proses penghitungan tanda tangan benih.

 

![Proses penghitungan tanda tangan benih.](https://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/images/sigV4-auth-header-chunked-seed-signature.png)


Tabel berikut menjelaskan fungsi yang ditunjukkan dalam diagram. Anda perlu menerapkan kode untuk fungsi-fungsi ini.


| Fungsi | Deskripsi | 
| --- | --- | 
| Lowercase() | Ubah string menjadi huruf kecil. | 
| Hex() | Pengkodean huruf kecil 16. | 
| SHA256Hash() | Fungsi hash kriptografi Secure Hash Algorithm (SHA). | 
| HMAC-SHA256() | Menghitung HMAC dengan menggunakan algoritma SHA256 dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir. | 
| Trim() | Hapus spasi kosong di depan atau di belakang.  | 
| UriEncode() | URI mengkodekan setiap byte. UriEncode() harus menegakkan aturan berikut:+  URI mengkodekan setiap byte kecuali karakter tanpa syarat: 'A'-'Z', 'a'-'z', '0'-'9', '-', ' . ',' \_ ', dan '\~'.  <br />+ Karakter spasi adalah karakter yang dicadangkan dan harus dikodekan sebagai “%20" (dan bukan sebagai “\+”). <br />+ Setiap byte yang dikodekan URI dibentuk oleh '%' dan nilai heksadesimal dua digit byte. <br />+ Huruf dalam nilai heksadesimal harus huruf besar, misalnya “%1A”. <br />+ Enkode karakter garis miring ke depan, '/', di mana-mana kecuali dalam nama kunci objek. Misalnya, jika nama kunci objek adalah`photos/Jan/sample.jpg`, garis miring ke depan dalam nama kunci tidak dikodekan.   UriEncode Fungsi standar yang disediakan oleh platform pengembangan Anda mungkin tidak berfungsi karena perbedaan dalam implementasi dan ambiguitas terkait dalam RFC yang mendasarinya. Kami menyarankan Anda menulis UriEncode fungsi kustom Anda sendiri untuk memastikan bahwa pengkodean Anda akan berfungsi. <br />Berikut ini adalah contoh fungsi UriEncode () di Java.<pre>public static String UriEncode(CharSequence input, boolean encodeSlash) {<br />          StringBuilder result = new StringBuilder();<br />          for (int i = 0; i < input.length(); i++) {<br />              char ch = input.charAt(i);<br />              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {<br />                  result.append(ch);<br />              } else if (ch == '/') {<br />                  result.append(encodeSlash ? "%2F" : ch);<br />              } else {<br />                  result.append(toHexUTF8(ch));<br />              }<br />          }<br />          return result.toString();<br />      }</pre> | 

Untuk informasi tentang proses penandatanganan, lihat[Perhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Satu Potongan (AWS Versi Tanda Tangan 4)](sig-v4-header-based-auth.md). Prosesnya sama, kecuali bahwa penciptaan `CanonicalRequest` berbeda sebagai berikut:
+ Selain header permintaan yang ingin Anda tambahkan, Anda harus menyertakan header berikut:    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/sigv4-streaming.html)

Anda mengirim potongan pertama dengan tanda tangan benih. Anda harus membangun potongan seperti yang dijelaskan di bagian berikut.

## Mendefinisikan Tubuh Potongan
<a name="sigv4-chunked-body-definition"></a>

Semua potongan menyertakan beberapa metadata. Setiap potongan harus sesuai dengan struktur berikut:

 

```
string(IntHexBase({{chunk-size}})) + ";chunk-signature=" + {{signature}} + \r\n + {{chunk-data}} + \r\n                    
```

Di mana:

 
+ `IntHexBase()`adalah fungsi yang Anda tulis untuk mengubah ukuran potongan integer menjadi heksadesimal. Misalnya, jika ukuran potongan adalah 65536, string heksadesimal adalah “10000".
+ {{chunk-size}}adalah ukuran, dalam byte, dari chunk-data, tanpa metadata. Misalnya, jika Anda mengunggah objek 65 KB dan menggunakan ukuran potongan 64 KB, Anda mengunggah data dalam tiga potongan: yang pertama akan menjadi 64 KB, yang kedua 1 KB, dan potongan terakhir dengan 0 byte.
+ {{signature}}Untuk setiap potongan, Anda menghitung tanda tangan menggunakan string berikut untuk ditandatangani. Untuk potongan pertama, Anda menggunakan seed-signature sebagai tanda tangan sebelumnya. 

  

     
![Proses penghitungan tanda tangan benih yang menunjukkan berbagai komponen string yang akan ditandatangani.](https://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/images/sigV4-auth-header-chunk-signature.png)



 Ukuran data potongan akhir yang Anda kirim adalah 0, meskipun tubuh potongan masih berisi metadata, termasuk tanda tangan dari potongan sebelumnya.

## Contoh: Objek PUT
<a name="example-signature-calculations-streaming"></a>

Anda dapat menggunakan contoh di bagian ini sebagai referensi untuk memeriksa perhitungan tanda tangan dalam kode Anda. Sebelum Anda meninjau contoh, perhatikan hal berikut:

 
+  Perhitungan tanda tangan dalam contoh ini menggunakan contoh kredentif keamanan berikut.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/sigv4-streaming.html)
+ Semua contoh menggunakan stempel waktu permintaan 20130524T000000Z (). `Fri, 24 May 2013 00:00:00 GMT`
+ Semua contoh digunakan `examplebucket` sebagai nama bucket.
+ Bucket diasumsikan berada di Wilayah AS Timur (Virginia Utara), dan kredenSIAL serta `Scope` `Signing Key` perhitungan digunakan `us-east-1` sebagai penentu Wilayah.  Untuk informasi selengkapnya, lihat [Wilayah dan Titik Akhir](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) dalam *Referensi Umum Amazon Web Services*. 
+ Anda dapat menggunakan gaya jalur atau permintaan gaya yang dihosting virtual. Contoh berikut menggunakan permintaan gaya yang dihosting virtual, misalnya: 

  ```
  https://examplebucket.s3.amazonaws.com/photos/photo1.jpg
  ```

  Untuk informasi selengkapnya, lihat Hosting [ Virtual Bucket ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) di Panduan Pengguna Layanan Penyimpanan Sederhana * Amazon*.

Contoh berikut mengirimkan `PUT` permintaan untuk mengunggah objek. Perhitungan tanda tangan mengasumsikan sebagai berikut:

 
+ Anda mengunggah file teks 65 KB, dan konten file adalah string satu karakter yang terdiri dari huruf 'a'. 
+ Ukuran potongan adalah 64 KB. Akibatnya, payload diunggah dalam tiga potongan, 64 KB, 1 KB, dan potongan terakhir dengan 0 byte data potongan. 
+ Objek yang dihasilkan memiliki nama kunci`chunkObject.txt`.
+ Anda meminta `REDUCED_REDUNDANCY` sebagai kelas penyimpanan dengan menambahkan header `x-amz-storage-class` permintaan.

Untuk informasi tentang tindakan API, lihat [ PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html). Sintaks permintaan umum adalah sebagai berikut: 

```
PUT /examplebucket/chunkObject.txt HTTP/1.1
Host: s3.amazonaws.com
x-amz-date: 20130524T000000Z 
x-amz-storage-class: REDUCED_REDUNDANCY
Authorization: {{SignatureToBeCalculated}}
x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD
Content-Encoding: aws-chunked
x-amz-decoded-content-length: 66560
Content-Length: 66824
{{<Payload>}}
```



Langkah-langkah berikut menunjukkan perhitungan tanda tangan.

1. 

**Tanda tangan benih - Buat String untuk Ditandatangani**

   1. 

**CanonicalRequest**

       

      ```
      PUT
      /examplebucket/chunkObject.txt
      
      content-encoding:aws-chunked
      content-length:66824
      host:s3.amazonaws.com
      x-amz-content-sha256:STREAMING-AWS4-HMAC-SHA256-PAYLOAD
      x-amz-date:20130524T000000Z
      x-amz-decoded-content-length:66560
      x-amz-storage-class:REDUCED_REDUNDANCY
      
      content-encoding;content-length;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-storage-class
      STREAMING-AWS4-HMAC-SHA256-PAYLOAD
      ```

      Dalam permintaan kanonik, baris ketiga kosong karena tidak ada parameter kueri dalam permintaan. Baris terakhir adalah string konstan yang disediakan sebagai nilai Payload yang di-hash, yang harus sama dengan nilai. `x-amz-content-sha256 header`

   1. 

**StringToSign**

       

      ```
      AWS4-HMAC-SHA256
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      cee3fed04b70f867d036f722359b0b1f2f0e5dc0efadbc082b76c4c60e316455
      ```

       

       
**catatan**  
Untuk informasi tentang setiap baris dalam string yang akan ditandatangani, lihat diagram yang menjelaskan perhitungan tanda tangan benih.

1. 

**SigningKey**

    

   ```
   signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "{{<YourSecretAccessKey>}}","20130524"),"us-east-1"),"s3"),"aws4_request")						
   ```

    

1. 

**Tanda Tangan Benih**

    

   ```
   4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9
   ```

    

1. 

**Header otorisasi**

   Header Otorisasi yang dihasilkan adalah sebagai berikut:

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=content-encoding;content-length;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-storage-class,Signature=4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9
   ```

    

1. 

**Potongan 1: (65536 byte, dengan nilai 97 untuk huruf 'a')**

   1. Potongan string untuk ditandatangani:

      ```
      AWS4-HMAC-SHA256-PAYLOAD
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      bf718b6f653bebc184e1479f1935b8da974d701b893afcf49e701f3e2f9f9c5a
      ```

       
**catatan**  
Untuk informasi tentang setiap baris dalam string yang akan ditandatangani, lihat diagram sebelumnya yang menunjukkan berbagai komponen string yang akan ditandatangani (misalnya, tiga baris terakhir adalah,`previous-signature`,`hash("")`, dan`hash(current-chunk-data)`).

   1. Tanda tangan potongan:

      ```
      ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648
      ```

   1. Data potongan dikirim:

      ```
      10000;chunk-signature=ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648
      <65536-bytes>
      ```

1. 

**Potongan 2: (1024 byte, dengan nilai 97 untuk huruf 'a')**

   1. Potongan string untuk ditandatangani:

      ```
      AWS4-HMAC-SHA256-PAYLOAD
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a
      ```

   1. Tanda tangan potongan:

      ```
      0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497
      ```

   1. Data potongan dikirim:

      ```
      400;chunk-signature=0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497
      <1024 bytes>
      ```

1. 

**Potongan 3: (0 byte data)**

   1. Potongan string untuk ditandatangani:

      ```
      AWS4-HMAC-SHA256-PAYLOAD
      20130524T000000Z
      20130524/us-east-1/s3/aws4_request
      0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

   1. Tanda tangan potongan:

      ```
      b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9
      ```

   1. Data potongan dikirim:

      ```
      0;chunk-signature=b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9
      ```