

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 Satu Potongan (AWS Versi Tanda Tangan 4)
<a name="sig-v4-header-based-auth"></a>

Saat menggunakan `Authorization` header untuk mengotentikasi permintaan, nilai header termasuk, antara lain, tanda tangan. Perhitungan tanda tangan bervariasi tergantung pada pilihan yang Anda buat untuk mentransfer payload ([Gambaran umum](sigv4-auth-using-authorization-header.md#sigv4-auth-header-overview)). Bagian ini menjelaskan perhitungan tanda tangan saat Anda memilih untuk mentransfer payload dalam satu potongan. Bagian contoh (lihat[Contoh: Perhitungan Tanda Tangan](#example-signature-calculations)) menunjukkan perhitungan tanda tangan dan `Authorization` header hasil yang dapat Anda gunakan sebagai rangkaian pengujian untuk memverifikasi kode Anda.

**penting**  
Saat mentransfer payload dalam satu potongan, Anda dapat secara opsional memilih untuk menyertakan hash payload dalam perhitungan tanda tangan, disebut sebagai payload yang * ditandatangani * (jika Anda tidak memasukkannya, payload dianggap tidak ditandatangani). * * Prosedur penandatanganan yang dibahas di bagian berikut berlaku untuk keduanya, tetapi perhatikan perbedaan berikut:  
   
**Opsi payload yang ditandatangani ** — Anda menyertakan hash payload saat membangun permintaan kanonik (yang kemudian menjadi bagian dari StringToSign, seperti yang dijelaskan di bagian perhitungan tanda tangan). Anda juga menentukan nilai yang sama dengan nilai `x-amz-content-sha256` header saat mengirim permintaan ke S3.
**Opsi payload yang tidak ditandatangani ** — Anda menyertakan string literal `UNSIGNED-PAYLOAD` saat membuat permintaan kanonik, dan menetapkan nilai yang sama dengan nilai `x-amz-content-sha256` header saat mengirim permintaan ke Amazon S3.
Saat Anda mengirim permintaan ke Amazon S3, nilai `x-amz-content-sha256` header memberi tahu Amazon S3 apakah payload ditandatangani atau tidak. Amazon S3 kemudian dapat membuat tanda tangan yang sesuai untuk verifikasi.  
Dalam kedua kasus, karena nilai `x-amz-content-sha256` header sudah menjadi bagian dari Anda`HashedPayload`, Anda tidak diharuskan untuk menyertakan `x-amz-content-sha256` header sebagai header kanonik.

## Menghitung Tanda Tangan
<a name="create-signature-presign-entire-payload"></a>

Untuk menghitung tanda tangan, pertama-tama Anda memerlukan string untuk ditandatangani. Anda kemudian menghitung `HMAC-SHA256` hash string untuk ditandatangani dengan menggunakan kunci penandatanganan. Diagram berikut menggambarkan proses, termasuk berbagai komponen string yang Anda buat untuk penandatanganan 

Ketika Amazon S3 menerima permintaan yang diautentikasi, ia menghitung tanda tangan dan kemudian membandingkannya dengan tanda tangan yang Anda berikan dalam permintaan. Untuk alasan itu, Anda harus menghitung tanda tangan dengan menggunakan metode yang sama yang digunakan oleh Amazon S3. Proses menempatkan permintaan dalam bentuk yang disepakati untuk penandatanganan disebut kanonikalisasi.

 

![AWS4-HMAC-SHA256 diagram proses tanda tangan yang menunjukkan permintaan kanonik, StringToSign, dan langkah-langkah tanda tangan.](https://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/images/sigV4-using-auth-header.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> | 

### Tugas 1: Buat Permintaan Kanonik
<a name="canonical-request"></a>

Bagian ini memberikan gambaran umum tentang membuat permintaan kanonik. 

Berikut ini adalah format permintaan kanonik yang digunakan Amazon S3 untuk menghitung tanda tangan. Agar tanda tangan cocok, Anda harus membuat permintaan kanonik dalam format ini: 

 

```
{{<HTTPMethod>}}\n
{{<CanonicalURI>}}\n
{{<CanonicalQueryString>}}\n
{{<CanonicalHeaders>}}\n
{{<SignedHeaders>}}\n
{{<HashedPayload>}}
```

Di mana:

 
+ {{HTTPMethod}}adalah salah satu metode HTTP, misalnya GET, PUT, HEAD, dan DELETE.
+ {{CanonicalURI}}adalah URI-encoded versi komponen jalur absolut dari URI — semuanya dimulai dengan “/” yang mengikuti nama domain dan hingga akhir string atau ke karakter tanda tanya ('?') jika Anda memiliki parameter string kueri. URI dalam contoh berikut,`/examplebucket/myphoto.jpg`, adalah jalur absolut dan Anda tidak mengkodekan “/” di jalur absolut:

   

  ```
  http://s3.amazonaws.com/examplebucket/myphoto.jpg
  ```

   
**catatan**  
Anda tidak menormalkan jalur URI untuk permintaan ke Amazon S3. Misalnya, Anda mungkin memiliki bucket dengan objek bernama “my-object//example//photo.user”. Normalisasi jalur mengubah nama objek dalam permintaan menjadi “my- object/example /photo.user”. Ini adalah jalur yang salah untuk objek itu.
+ {{CanonicalQueryString}}menentukan parameter URI-encoded string kueri. Anda URI-encode nama dan nilai satu per satu. Anda juga harus mengurutkan parameter dalam string kueri kanonik menurut abjad berdasarkan nama kunci. Penyortiran terjadi setelah pengkodean. String kueri dalam contoh URI berikut adalah`prefix=somePrefix&marker=someMarker&max-keys=20`:

   

  ```
  http://s3.amazonaws.com/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20
  ```

  String kueri kanonik adalah sebagai berikut (jeda baris ditambahkan ke contoh ini untuk keterbacaan):

   

  ```
  UriEncode("marker")+"="+UriEncode("someMarker")+"&"+
  UriEncode("max-keys")+"="+UriEncode("20") + "&" +
  UriEncode("prefix")+"="+UriEncode("somePrefix")
  ```

  Ketika permintaan menargetkan subresource, nilai parameter query yang sesuai akan menjadi string kosong (“”). Misalnya, URI berikut mengidentifikasi `ACL` subresource pada `examplebucket` bucket:

   

  ```
  http://s3.amazonaws.com/examplebucket?acl 
  ```

  Dalam hal ini adalah sebagai berikut: CanonicalQueryString 

   

  ```
  UriEncode("acl") + "=" + ""
  ```

  Jika URI tidak menyertakan '?' , tidak ada string kueri dalam permintaan, dan Anda mengatur string kueri kanonik ke string kosong (“”). Anda masih perlu memasukkan "\\ n”.
+ {{CanonicalHeaders}}adalah daftar header permintaan dengan nilainya. Nama header individu dan pasangan nilai dipisahkan oleh karakter baris baru (”\\ n “). Nama header harus dalam huruf kecil. Anda harus mengurutkan nama header menurut abjad untuk membangun string, seperti yang ditunjukkan dalam contoh berikut:

   

  ```
  Lowercase({{<HeaderName1>}})+":"+Trim({{<value>}})+"\n"
  Lowercase({{<HeaderName2>}})+":"+Trim({{<value>}})+"\n"
  ...
  Lowercase({{<HeaderNameN>}})+":"+Trim({{<value>}})+"\n"
  ```

  `Trim()`Fungsi `Lowercase()` dan yang digunakan dalam contoh ini dijelaskan di bagian sebelumnya. 

  {{CanonicalHeaders}}Daftar harus mencakup yang berikut: 
  + `host`header HTTP.
  + Jika `Content-MD5` header ada dalam permintaan, Anda harus menambahkannya ke {{CanonicalHeaders}} daftar. 
  + Setiap `x-amz-*` header yang Anda rencanakan untuk disertakan dalam permintaan Anda juga harus ditambahkan. Misalnya, jika Anda menggunakan kredentif keamanan sementara, Anda harus menyertakan `x-amz-security-token` dalam permintaan Anda. Anda harus menambahkan header ini dalam daftar{{CanonicalHeaders}}.
**catatan**  
`x-amz-content-sha256`Header diperlukan untuk semua permintaan AWS Signature Version 4. Ini menyediakan hash dari payload permintaan. Namun, Anda tidak diharuskan menyertakan `x-amz-content-sha256` sebagai header kanonik karena S3 akan secara otomatis menggunakan nilainya saat menghitung hash payload yang dikirim dalam permintaan.
Jika tidak ada payload, Anda harus memberikan hash dari string kosong. 
Jika Anda tidak ingin S3 memeriksa hash permintaan, Anda dapat menggunakan string literal sebagai gant `"UNSIGNED-PAYLOAD"` inya.

  Berikut ini adalah contoh `CanonicalHeaders` string. Nama header dalam huruf kecil dan diurutkan.  
**Example Contoh 1**  

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  x-amz-date:20130708T220855Z
  ```  
**Example Contoh 2**  

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:UNSIGNED-PAYLOAD
  x-amz-date:20130708T220855Z
  ```  
**Example Contoh 3**  

  ```
  host:s3.amazonaws.com
  x-amz-date:20130708T220855Z
  ```
**catatan**  
Untuk tujuan menghitung tanda tangan otorisasi, header host dan semua `x-amz-*` header, tidak termasuk`x-amz-content-sha256`, diperlukan. Namun, untuk mencegah gangguan data, Anda harus mempertimbangkan untuk memasukkan semua header dalam perhitungan tanda tangan.  
Menandatangani `x-amz-content-sha256` header bersifat opsional karena S3 akan menggunakan nilainya saat menghitung hash payload permintaan yang diterima. 
+ {{SignedHeaders}}adalah daftar nama header permintaan huruf kecil yang diurutkan berdasarkan abjad dan dipisahkan titik koma. Header permintaan dalam daftar adalah header yang sama yang Anda sertakan dalam string. `CanonicalHeaders` Dalam contoh sebelumnya, nilainya {{SignedHeaders}} adalah sebagai berikut:

    
**Example Contoh 1 dan 2**  

  ```
  host;x-amz-content-sha256;x-amz-date
  ```  
**Example Contoh 3**  

  ```
  host;x-amz-date
  ```
+ {{HashedPayload}}adalah nilai heksadesimal dari hash SHA256 dari payload permintaan. 

   

  ```
  Hex(SHA256Hash({{<payload>}})
  ```

  Jika tidak ada payload dalam permintaan, Anda menghitung hash dari string kosong sebagai berikut:

   

  ```
  Hex(SHA256Hash(""))
  ```

  Hash mengembalikan nilai berikut:

   

  ```
  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  
  ```

  Misalnya, ketika Anda mengunggah objek dengan menggunakan permintaan PUT, Anda memberikan data objek dalam tubuh. Ketika Anda mengambil objek dengan menggunakan permintaan GET, Anda menghitung hash string kosong. 

### Tugas 2: Buat String untuk Ditandatangani
<a name="request-string"></a>

Bagian ini memberikan gambaran umum tentang membuat string untuk ditandatangani. Untuk petunjuk langkah demi langkah, lihat [ Tugas 2: Membuat String untuk ](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html) Masuk *Referensi Umum AWS*.

String yang akan ditandatangani adalah gabungan dari string berikut:

 

```
"AWS4-HMAC-SHA256" + "\n" +
timeStampISO8601Format + "\n" +
{{<Scope>}} + "\n" +
Hex(SHA256Hash({{<CanonicalRequest>}}))
```

String konstan `AWS4-HMAC-SHA256` menentukan algoritma hash yang Anda gunakan, HMAC-SHA256. Ini `timeStamp` adalah waktu UTC saat ini dalam format ISO 8601 (misalnya,`20130524T000000Z`). 

`Scope`mengikat tanda tangan yang dihasilkan ke tanggal tertentu Wilayah AWS, sebuah, dan layanan. Dengan demikian, tanda tangan yang dihasilkan hanya akan berfungsi di Wilayah tertentu dan untuk layanan tertentu. Tanda tangan berlaku selama tujuh hari setelah tanggal yang ditentukan.

 

```
date.Format({{<YYYYMMDD>}}) + "/" + {{<region>}} + "/" + {{<service>}} + "/aws4_request"
```

 Untuk Amazon S3, string layanan adalah`s3`. Untuk daftar {{region}} string, lihat Wil [ ayah dan Titik Akhir ](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) di *Referensi Umum AWS*. Kolom Wilayah dalam tabel ini menyediakan daftar string Wilayah yang valid.

 Cakupan berikut membatasi tanda tangan yang dihasilkan ke Wil `us-east-1` ayah dan Amazon S3. 

```
20130606/us-east-1/s3/aws4_request
```

 

**catatan**  
 `Scope`harus menggunakan tanggal yang sama yang Anda gunakan untuk menghitung kunci penandatanganan, seperti yang dibahas di bagian berikut. 

### Tugas 3: Hitung Tanda Tangan
<a name="signing-key"></a>

 Di AWS Tanda Tangan Versi 4, alih-alih menggunakan kunci AWS akses untuk menandatangani permintaan, pertama-tama Anda membuat kunci penandatanganan yang dicakup ke Wilayah dan layanan tertentu.  Untuk informasi selengkapnya tentang penandatanganan kunci, lihat[Pengantar Permintaan Penandatanganan](sig-v4-authenticating-requests.md#signing-request-intro). 

 

```
DateKey              = HMAC-SHA256("AWS4"+"{{<SecretAccessKey>}}", "{{<YYYYMMDD>}}")
DateRegionKey        = HMAC-SHA256({{<DateKey>}}, "{{<aws-region>}}")
DateRegionServiceKey = HMAC-SHA256({{<DateRegionKey>}}, "{{<aws-service>}}")
SigningKey           = HMAC-SHA256({{<DateRegionServiceKey>}}, "aws4_request")
```

 

**catatan**  
Beberapa kasus penggunaan dapat memproses kunci tanda tangan hingga 7 hari. Untuk informasi selengkapnya, lihat [ Berbagi Objek dengan Orang Lain](https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html).

Untuk daftar string Wilayah, lihat Wil [ ayah dan Titik Akhir ](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) di *Referensi Umum AWS*.

 Menggunakan kunci penandatanganan memungkinkan Anda menyimpan AWS kredensibilitas Anda di satu tempat yang aman. Misalnya, jika Anda memiliki beberapa server yang berkomunikasi dengan Amazon S3, Anda membagikan kunci penandatanganan dengan server tersebut; Anda tidak perlu menyimpan salinan kunci akses rahasia Anda di setiap server. Kunci penandatanganan berlaku hingga tujuh hari. Jadi setiap kali Anda menghitung kunci penandatanganan, Anda perlu membagikan kunci penandatanganan dengan server Anda. Untuk informasi selengkapnya, lihat [Permintaan Otentikasi (AWS Versi Tanda Tangan 4)](sig-v4-authenticating-requests.md).

Tanda tangan terakhir adalah HMAC-SHA256 hash dari string yang akan ditandatangani, menggunakan kunci penandatanganan sebagai kunci.

 

```
HMAC-SHA256(SigningKey, StringToSign)
```

Untuk petunjuk langkah demi langkah tentang membuat tanda tangan, lihat [ Tugas 3: Membuat Tangan ](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html) Tangan di *Referensi Umum AWS*.

### Contoh: Perhitungan Tanda Tangan
<a name="example-signature-calculations"></a>

Anda dapat menggunakan contoh di bagian ini sebagai referensi untuk memeriksa perhitungan tanda tangan dalam kode Anda. Perhitungan yang ditunjukkan dalam contoh menggunakan data berikut:

 
+  Contoh kunci akses.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/id_id/AmazonS3/latest/developerguide/sig-v4-header-based-auth.html)
+ Minta stempel waktu 20130524T000000Z (). `Fri, 24 May 2013 00:00:00 GMT`
+ Nama bucket`examplebucket`.
+ Ember diasumsikan berada di Wilayah Timur AS (Virginia Utara). Kredensi `Scope` dan `Signing Key` perhitungan digunakan `us-east-1` sebagai penentu Wilayah. Untuk informasi tentang Wilayah lain, lihat Wil [ ayah dan Titik Akhir ](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region) di *Referensi Umum AWS*. 
+ Anda dapat menggunakan permintaan gaya path atau virtual hosted—style. Contoh berikut menunjukkan cara menandatangani permintaan gaya host 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: GET Object
<a name="example-signature-GET-object"></a>

Contoh berikut mendapatkan 10 byte pertama dari sebuah objek (test.txt) dari`examplebucket`. Untuk informasi selengkapnya tentang tindakan API, lihat [ GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).

 

```
GET /test.txt HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
Range: bytes=0-9 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date: 20130524T000000Z
```

Karena permintaan GET ini tidak menyediakan konten tubuh apa pun, `x-amz-content-sha256` nilainya dapat berupa hash dari badan permintaan kosong atau string literal`"UNSIGNED-PAYLOAD"`. Langkah-langkah berikut menunjukkan perhitungan tanda tangan dan konstruksi `Authorization` header menggunakan hash dari string kosong. 

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /test.txt
      
      host:examplebucket.s3.amazonaws.com
      range:bytes=0-9
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;range;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      Dalam string permintaan kanonik, baris terakhir adalah hash dari badan permintaan kosong. Baris ketiga kosong karena tidak ada parameter kueri dalam permintaan. 

   1. 

**StringToSign**

       

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

       

1. 

**SigningKey**

    

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

    

1. 

**Tanda tangan**

    

   ```
   f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41
   ```

    

1. 

**Header otorisasi**

   `Authorization`Header yang dihasilkan adalah sebagai berikut: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;range;x-amz-content-sha256;x-amz-date,Signature=f0e8bdb87c964420e857bd35b5d6ed310bd44f0170aba48dd91039c6036bdb41
   ```

    

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

Contoh permintaan PUT ini membuat objek (`test$file.text`) di`examplebucket`. Contoh tersebut mengasumsikan sebagai berikut:

 
+ Anda meminta `REDUCED_REDUNDANCY` sebagai kelas penyimpanan dengan menambahkan header `x-amz-storage-class` permintaan. Untuk informasi tentang kelas penyimpanan, lihat Kelas [ Penyimpanan ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingMetadata.html#storage-class-intro) di Panduan Pengguna Layanan Penyimpanan Sederhana * Amazon*.
+ Isi file yang diunggah adalah string, `"Welcome to Amazon S3."` `x-amz-content-sha256` Nilai permintaan didasarkan pada string ini.

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

```
PUT test$file.text HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Date: Fri, 24 May 2013 00:00:00 GMT
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-storage-class: REDUCED_REDUNDANCY
x-amz-content-sha256: 44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072

{{<Payload>}}
```



Langkah-langkah berikut menunjukkan perhitungan tanda tangan.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      PUT
      /test%24file.text
      
      date:Fri, 24 May 2013 00:00:00 GMT
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072
      x-amz-date:20130524T000000Z
      x-amz-storage-class:REDUCED_REDUNDANCY
      
      date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class
      44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072
      ```

      Dalam permintaan kanonik, baris ketiga kosong karena tidak ada parameter kueri dalam permintaan. Header `x-amz-content-sha256` kanonik dapat secara opsional ditandatangani karena hash payloadnya sudah disediakan di bagian bawah permintaan. Baris terakhir adalah hash tubuh, yang harus sama dengan `x-amz-content-sha256 header` nilai yang dikirim ke S3 dalam permintaan HTTP.

   1. 

**StringToSign**

       

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

       

1. 

**SigningKey**

    

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

    

1. 

**Tanda tangan**

    

   ```
   98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd
   ```

    

1. 

**Header otorisasi**

   `Authorization`Header yang dihasilkan adalah sebagai berikut:

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd
   ```

    

#### Contoh: GET Bucket Lifecycle
<a name="example-signature-GET-bucket-lifecycle"></a>

Permintaan GET berikut mengambil konfigurasi siklus hidup. `examplebucket` Untuk informasi tentang tindakan API, lihat [ GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html). 

```
GET ?lifecycle HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
```

Karena permintaan tidak menyediakan konten tubuh apa pun, nilai `x-amz-content-sha256` header adalah hash dari badan permintaan kosong. Langkah-langkah berikut menunjukkan perhitungan tanda tangan.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /
      lifecycle=
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      Dalam permintaan kanonik, baris terakhir adalah hash dari badan permintaan kosong. 

   1. 

**StringToSign**

       

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

       

1. 

**SigningKey**

    

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

    

1. 

**Tanda tangan**

    

   ```
   fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543
   ```

    

1. 

**Header otorisasi**

   `Authorization`Header yang dihasilkan adalah sebagai berikut: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=fea454ca298b7da1c68078a5d1bdbfbbe0d65c699e0f91ac7a200a0136783543
   ```

    

#### Contoh: Dapatkan Bucket (Daftar Objek)
<a name="example-signature-list-bucket"></a>

Contoh berikut mengambil daftar objek dari `examplebucket` bucket. Untuk informasi tentang tindakan API, lihat [ ListObjects](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html). 

```
GET ?max-keys=2&prefix=J HTTP/1.1
Host: examplebucket.s3.amazonaws.com
Authorization: {{SignatureToBeCalculated}}
x-amz-date: 20130524T000000Z 
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
```

Karena permintaan tidak menyediakan badan, nilainya `x-amz-content-sha256` adalah hash dari badan permintaan kosong. Langkah-langkah berikut menunjukkan perhitungan tanda tangan.

1. 

**StringToSign**

   1. 

**CanonicalRequest**

       

      ```
      GET
      /
      max-keys=2&prefix=J
      host:examplebucket.s3.amazonaws.com
      x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      x-amz-date:20130524T000000Z
      
      host;x-amz-content-sha256;x-amz-date
      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
      ```

      Dalam string kanonik, baris terakhir adalah hash dari badan permintaan kosong. 

   1. 

**StringToSign**

       

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

       

1. 

**SigningKey**

    

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

    

1. 

**Tanda tangan**

    

   ```
   34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7
   ```

    

1. 

**Header otorisasi**

   `Authorization`Header yang dihasilkan adalah sebagai berikut: 

    

   ```
   AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=34b48302e7b5fa45bde8084f4b7868a86f0a534bc59db6670ed5711ef69dc6f7
   ```

    