Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menandatangani dan mengotentikasi permintaan REST (AWS tanda tangan versi 2)
Topik
catatan
Topik ini menjelaskan tentang autentikasi permintaan dengan menggunakan Tanda Tangan Versi 2. Amazon S3 kini mendukung Tanda Tangan Versi 4 terbaru. Versi tanda tangan terbaru ini didukung di semua wilayah dan setiap wilayah baru setelah 30 Januari 2014 hanya akan mendukung Tanda Tangan Versi 4. Untuk informasi selengkapnya, buka Permintaan Otentikasi (T AWS anda Tangan Versi 4) di Refer ensi API Layanan Penyimpanan Sederhana Amazon.
Autentikasi adalah proses pembuktian identitas Anda pada sistem. Identitas adalah faktor penting dalam keputusan kontrol akses Amazon S3. Permintaan diizinkan atau ditolak sebagian berdasarkan identitas pemohon. Sebagai contoh, hak untuk membuat bucket disediakan untuk pengembang yang terdaftar dan (secara default) hak untuk membuat objek di dalam bucket disediakan untuk pemilik bucket yang bersangkutan. Sebagai pengembang, Anda akan membuat permintaan yang menginvokasi hak istimewa ini, jadi Anda perlu membuktikan identitas pada sistem dengan melakukan autentikasi atas permintaan Anda. Dalam bagian ini, akan ditunjukkan caranya.
catatan
Konten dalam bagian ini tidak berlaku untuk POST HTTP. Untuk informasi selengkapnya, lihat Browser-based unggah menggunakan POST (AWS tanda tangan versi 2).
API REST Amazon S3 menggunakan skema HTTP kustom berdasarkan kunci-HMAC (Kode Autentikasi Pesan Hash) untuk autentikasi. Untuk mengautentikasi permintaan, pertama-tama Anda perlu menggabungkan elemen-elemen yang dipilih dari permintaan tersebut untuk membentuk string. Anda kemudian menggunakan kunci akses AWS rahasia Anda untuk menghitung HMAC dari string itu. Secara informal, proses ini disebut “menandatangani permintaan,” dan output dari algoritma HMAC adalah tanda tangan, karena mensimulasikan properti keamanan dari tanda tangan nyata. Terakhir, Anda perlu menambahkan tanda tangan ini sebagai parameter permintaan dengan menggunakan sintaks yang dijelaskan dalam bagian ini.
Ketika sistem menerima permintaan yang diautentikasi, ia mengambil kunci akses AWS rahasia yang Anda klaim miliki dan menggunakannya dengan cara yang sama untuk menghitung tanda tangan untuk pesan yang diterimanya. Kemudian, sistem akan membandingkan tanda tangan yang dihitung dengan tanda tangan yang diberikan oleh pemohon. Jika kedua tanda tangan cocok, sistem menyimpulkan bahwa pemohon harus memiliki akses ke kunci akses AWS rahasia dan karena itu bertindak dengan otoritas kepala sekolah kepada siapa kunci dikeluarkan. Jika kedua tanda tangan tidak cocok, permintaan akan dibatalkan dan sistem merespons dengan mengirimkan pesan kesalahan.
contoh Permintaan REST Amazon S3 yang telah diautentikasi
GET /photos/puppy.jpg HTTP/1.1 Host: awsexamplebucket1.us-west-1.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000Authorization: AWS AKIAIOSFODNN7EXAMPLE: qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
Menggunakan kredensial keamanan sementara
Jika Anda menandatangani permintaan menggunakan kredensial keamanan sementara (lihat Membuat permintaan), Anda harus menyertakan token keamanan yang sesuai dalam permintaan dengan menambahkan header x-amz-security-token.
Saat Anda memperoleh kredensial keamanan sementara menggunakan API AWS Security Token Service
, respons tersebut mencakup kredensial keamanan sementara dan token sesi. Anda memberikan nilai token sesi dalam header x-amz-security-token saat Anda mengirim permintaan ke Amazon S3. Untuk informasi tentang AWS Security Token Service API yang disediakan oleh IAM, buka T indakan di Panduan Refer AWS Security Token Service ensi API.
Header autentikasi
API REST Amazon S3 menggunakan header HTTP Authorization standar untuk memberikan informasi autentikasi. (Nama header standar tidak disarankan karena memuat informasi autentikasi, bukan otorisasi.) Berdasarkan skema autentikasi Amazon S3, header Otorisasi memiliki bentuk berikut ini:
Authorization: AWSAWSAccessKeyId:Signature
Pengembang diberikan ID kunci AWS akses dan kunci akses AWS rahasia ketika mereka mendaftar. Untuk autentikasi permintaan, elemen AWSAccessKeyId mengidentifikasi ID kunci akses yang digunakan untuk menghitung tanda tangan dan secara tidak langsung, juga mengidentifikasi pengembang yang mengajukan permintaan.
SignatureElemen adalah RFC 2104 HMAC-SHA1 dari elemen yang dipilih dari permintaan, sehingga Signature bagian dari header Otorisasi akan bervariasi dari permintaan ke permintaan. Jika tanda tangan permintaan yang dihitung oleh sistem cocok dengan yang diser Signature takan dengan permintaan, pemohon akan menunjukkan kepemilikan kunci akses AWS rahasia. Permintaan tersebut kemudian akan diproses menggunakan identitas tersebut dan dengan otoritas dari pengembang yang diberikan kunci tersebut.
Berikut ini adalah pseudogrammar yang mengilustrasikan konstruksi header permintaan Authorization. (Dalam contoh tersebut, \n berarti titik kode Unicode U+000A, umumnya disebut sebagai baris baru).
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ subresource, if present. For example "?acl", "?location", or "?logging"]; CanonicalizedAmzHeaders = <described below>
HMAC-SHA1 adalah algoritma yang didefinisikan oleh RFC 2104 - Keyed-Hashing untuk Otentikasi Pesan. YourSecretAccessKey) sebagai kunci, dan peng UTF-8 kodean StringToSign sebagai pesan. Output dari juga HMAC-SHA1 merupakan string byte, yang disebut Digest. Parameter permintaan Signature dibangun berdasarkan Base64 yang mengkodekan digest ini.
Kanonikalisasi permintaan untuk penandatanganan
Ingatlah bahwa ketika sistem menerima permintaan yang diautentikasi, sistem tersebut membandingkan tanda tangan permintaan yang dikomputasi dengan tanda tangan yang disertakan dalam permintaan di StringToSign. Oleh karena itu, Anda harus melakukan komputasi tanda tangan dengan menggunakan metode yang sama seperti yang digunakan oleh Amazon S3. Proses menempatkan permintaan dalam bentuk yang disepakati untuk menandatangani kanonikalisasi.
Membangun CanonicalizedResource elemen
CanonicalizedResource mewakili sumber daya Amazon S3 yang ditarget oleh permintaan. Buat elemen permintaan REST sebagai berikut:
-
Mulai dengan string kosong (
""). -
Jika permintaan menetapkan bucket untuk menggunakan header Host HTTP (gaya hosting virtual), tambahkan nama bucket yang diawali dengan
"/"(misalnya, "/bucketname"). Untuk permintaan yang menggunakan gaya penulisan path dan permintaan yang tidak ditujukan ke bucket, jangan lakukan apa pun. Untuk informasi selengkapnya tentang permintaan gaya host virtual, lihat Hosting virtual bucket.Untuk permintaan gaya host virtual, "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg“adalah “/awsexamplebuck
CanonicalizedResourceet1".Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg“,
CanonicalizedResourceadalah “”. -
Tambahkan bagian jalur dari HTTP yang tidak didekode Request-URI, hingga tetapi tidak termasuk string kueri.
Untuk permintaan gaya host virtual, "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg“
CanonicalizedResourceadalah “/awsexamplebucket1/photos/puppy.jpg”.Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg“,
CanonicalizedResourceadalah “/awsexamplebucket1/photos/puppy.jpg”. Pada titik ini,CanonicalizedResourcesama, baik untuk permintaan gaya penulisan hosting virtual dan permintaan gaya penulisan path.Untuk permintaan yang tidak menyebutkan bucket, misalnya Layanan DAPATKAN, tambahkan "/".
-
Jika permintaan membahas sub-sumber daya, seperti
?versioning,?location,?acl,?lifecycle, atau?versionidtambahkan sub-sumber dayanya, nilainya, jika ada, dan tanda tanya. Perhatikan bahwa dalam kasus beberapa subsumber daya, subsumber daya harus diurutkan secara leksikografis berdasarkan nama subsumber daya dan dipisahkan oleh '&', misalnya,? ACL&versionId =value.Subsumber daya yang harus disertakan saat membangun CanonicalizedResource Elemen adalah acl, siklus hidup, lokasi, logging, notifikasi, partNumber, kebijakan, requestPayment, uploadID, unggahan, versionId, versioning, versi, dan situs web.
Jika permintaan menentukan parameter string kueri yang menimpa nilai header respons (lihat Dapatkan Objek), tambahkan parameter string kueri dan nilainya. Saat menandatangani, Anda tidak melakukan encoding atas nilai-nilai ini; namun, saat membuat permintaan, Anda harus melakukan encoding atas nilai-nilai parameter ini. Parameter string kueri dalam permintaan DAPATKAN meliputi
response-content-type,response-content-language,response-expires,response-cache-control,response-content-disposition, danresponse-content-encoding.Parameter string
deletekueri harus disertakan saat Anda membuat permintaan Delete multi-objek. CanonicalizedResource
Elemen CanonicalizedResource yang berasal dari HTTP Request-URI harus ditandatangani secara harfiah seperti yang muncul dalam permintaan HTTP, termasuk karakter URL-Encoding meta.
Ini CanonicalizedResource mungkin berbeda dari HTTP Request-URI. Secara khusus, jika permintaan Anda menggunakan Host header HTTP untuk menentukan bucket, bucket tidak muncul di HTTP Request-URI. Namun, CanonicalizedResource harus tetap menyertakan bucket. Parameter string kueri mungkin juga muncul di Request-URI tetapi tidak termasuk dalamCanonicalizedResource. Untuk informasi selengkapnya, lihat Hosting virtual bucket.
Membangun CanonicalizedAmzHeaders elemen
Untuk membangun CanonicalizedAmzHeaders bagian dariStringToSign, pilih semua header permintaan HTTP yang dimulai dengan 'x-amz-' (menggunakan perbandingan case-insensitive), dan gunakan proses berikut.
-
Ubah setiap nama header HTTP menjadi huruf kecil. Misalnya, '
X-Amz-Date' menjadi 'x-amz-date'. -
Urutkan pengumpulan header secara leksikografis berdasarkan nama header.
-
Gabungkan kolom header dengan nama yang sama menjadi satu pasangan "header-name:comma-separated-value-list" sebagaimana yang ditentukan dalam RFC 2616, bagian 4.2, tanpa spasi antar nilai. Misalnya, dua metadata header '
x-amz-meta-username: fred' dan 'x-amz-meta-username: barney' akan digabungkan ke dalam header tunggal 'x-amz-meta-username: fred,barney'. -
“Buka” header panjang yang mencakup beberapa baris (sebagaimana yang diizinkan oleh RFC 2616, bagian 4.2) dengan mengganti spasi terlipat (termasuk baris baru) dengan satu spasi.
-
Hapus setiap spasi di sekitar titik dua yang terdapat dalam header. Misalnya, header '
x-amz-meta-username: fred,barney' akan menjadi 'x-amz-meta-username:fred,barney'. -
Terakhir, tambahkan karakter baris baru (
U+000A) untuk setiap header kanonikalisasi dalam daftar hasil. Membuat elemen CanonicalizedResource dengan menggabungkan semua header dalam daftar ini menjadi satu string tunggal.
Elemen header StringToSign HTTP posisi versus bernama
Beberapa elemen header pertama dari StringToSign (Content-Type, Date, and Content-MD5) bersifat posisional. StringToSigntidak menyertakan nama-nama header ini, hanya nilainya dari permintaan. Sebaliknya, elemen 'x-amz-' diberi nama. Baik nama header dan nilai header akan muncul di StringToSign.
Jika header posisional yang disebutkan dalam definisi StringToSign tidak ada dalam permintaan Anda (misalnya, Content-Type atau Content-MD5 bersifat opsional untuk permintaan LETAKKAN dan tidak penting untuk permintaan DAPATKAN), ganti string kosong ("") untuk posisi tersebut.
Ketentuan stempel waktu
Stempel waktu yang valid (baik menggunakan header HTTP Date atau alternatif x-amz-date) wajib untuk permintaan yang diautentikasi. Selain itu, stempel waktu klien yang disertakan dengan permintaan yang diautentikasi harus dalam waktu 15 menit dari waktu sistem Amazon S3 saat permintaan tersebut diterima. Jika tidak, permintaan akan gagal dengan kode kesalahan RequestTimeTooSkewed. Tujuan dari pembatasan ini adalah untuk membatasi kemungkinan bahwa permintaan yang diintersepsi dapat diputar ulang oleh pihak lawan. Untuk perlindungan yang lebih kuat terhadap intervensi, gunakan transportasi HTTPS untuk permintaan yang diautentikasi.
catatan
Batasan validasi pada tanggal permintaan hanya berlaku untuk permintaan yang diautentikasi yang tidak menggunakan autentikasi string kueri. Untuk informasi selengkapnya, lihat Alternatif autentikasi permintaan string kueri.
Beberapa pustaka klien HTTP tidak memaparkan kemampuan untuk mengatur header Date untuk permintaan. Jika Anda mengalami masalah saat menyertakan nilai header 'Tanggal' di header kanonikalisasi, Anda dapat mengatur stempel waktu untuk permintaan tersebut dengan menggunakan header 'x-amz-date'. Nilai x-amz-date header harus dalam salah satu format RFC 2616 () http://www.ietf.org/rfc/rfc2616.txtx-amz-date terdapat dalam permintaan, maka sistem akan mengabaikan header Date saat melakukan komputasi tanda tangan permintaan. Oleh karena itu, jika Anda menyertakan header x-amz-date, gunakan string kosong untuk Date saat membangun StringToSign. Lihat contohnya di bagian berikut.
Contoh-contoh autentikasi
Contoh-contoh dalam bagian ini menggunakan kredensial (nonkerja) dalam tabel berikut.
| Parameter | Nilai |
|---|---|
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE |
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
Dalam contoh StringToSign, format tidak signifikan, dan \n berarti titik kode Unicode U+000A yang biasanya disebut sebagai baris baru. Selain itu, contoh tersebut menggunakan “+0000” untuk menentukan zona waktu. Anda dapat menggunakan “GMT” untuk menentukan zona waktu, tetapi tanda tangan yang ditunjukkan dalam contoh tersebut akan berbeda.
Objek DAPATKAN
Contoh ini mendapatkan objek dari bucket awsexamplebucket1.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan bahwa CanonicalizedResource menyertakan nama bucket, tetapi HTTP Request-URI tidak. (Bucket ditentukan berdasarkan header Host.)
catatan
Skrip Python berikut ini menghitung tanda tangan sebelumnya, menggunakan parameter yang disediakan. Anda dapat menggunakan skrip ini untuk membuat tanda tangan Anda sendiri, mengganti kunci dan StringToSign sebagaimana mestinya.
import base64 import hmac from hashlib import sha1 access_key = 'AKIAIOSFODNN7EXAMPLE'.encode("UTF-8") secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'.encode("UTF-8") string_to_sign = 'GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg'.encode("UTF-8") signature = base64.b64encode( hmac.new( secret_key, string_to_sign, sha1 ).digest() ).strip() print(f"AWS {access_key.decode()}:{signature.decode()}")
Objek LETAKKAN
Contoh ini menempatkan sebuah objek ke dalam bucket awsexamplebucket1.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan Content-Type header dalam permintaan dan di StringToSign. Perhatikan juga bahwa Content-MD5 dibiarkan kosong di StringToSign, karena tidak ada dalam permintaan.
Daftar
Contoh ini mencantumkan konten dari bucket awsexamplebucket1.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan garis miring pada CanonicalizedResource dan tidak adanya parameter string kueri.
Mengambil
Contoh ini mengambil sub-sumber daya kebijakan kontrol akses untuk bucket 'awsexamplebucket1'.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan bagaimana parameter string kueri sub-sumber daya disertakan di CanonicalizedResource.
Delete
Contoh ini menghapus objek dari bucket 'awsexamplebucket1' menggunakan alternatif gaya penulisan path dan Tanggal.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan bagaimana metode alternatif 'x-amz-date' untuk menentukan tanggal (karena perpustakaan klien kami mencegah kami mengatur tanggal, katakanlah). Dalam hal ini, x-amz-date lebih diutamakan dari header Date. Oleh karena itu, entri tanggal pada tanda tangan harus berisi nilai header x-amz-date.
Unggah
Contoh ini mengunggah objek ke bucket yang dihosting virtual bergaya CNAME dengan metadata.
| Permintaan | StringToSign |
|---|---|
|
|
Perhatikan bagaimana header 'x-amz-' diurutkan, dipotong spasi ekstranya, dan diubah menjadi huruf kecil. Perhatikan juga bahwa beberapa header yang memiliki nama yang sama telah digabungkan menggunakan koma untuk memisahkan nilai.
Perhatikan bagaimana hanya header entitas HTTP Content-Type dan Content-MD5 yang muncul di StringToSign. Header entitas Content-* lainnya tidak muncul.
Sekali lagi, perhatikan CanonicalizedResource bahwa menyertakan nama bucket, tetapi HTTP Request-URI tidak. (Bucket ditentukan berdasarkan header Host.)
Tuliskan semua bucket saya
| Permintaan | StringToSign |
|---|---|
|
|
Kunci Unicode
| Permintaan | StringToSign |
|---|---|
|
|
catatan
Unsur-unsur StringToSign yang berasal dari diambil Request-URI secara harfiah, termasuk URL-Encoding dan kapitalisasi.
Masalah penandatanganan permintaan REST
Saat autentikasi permintaan REST gagal, sistem akan merespons permintaan tersebut dengan dokumen kesalahan XML. Informasi yang terdapat dalam dokumen kesalahan ini ditujukan untuk membantu pengembang melakukan diagnosis masalah. Secara khusus, elemen StringToSign dari dokumen kesalahan SignatureDoesNotMatch memberi tahu Anda dengan tepat kanonikalisasi permintaan yang digunakan oleh sistem.
Beberapa toolkit diam-diam memasukkan header yang tidak Anda ketahui sebelumnya, misalnya menambahkan header Content-Type selama LETAKKAN. Dalam sebagian besar kasus ini, nilai header yang dimasukkan tetap konstan, sehingga Anda dapat menemukan header yang hilang dengan menggunakan alat seperti Ethereal atau tcpmon.
Alternatif autentikasi permintaan string kueri
Anda dapat melakukan autentikasi atas jenis permintaan tertentu dengan meneruskan informasi yang diperlukan sebagai parameter string kueri dan bukan dengan menggunakan header HTTP Authorization. Ini berguna untuk mengaktifkan akses peramban pihak ketiga langsung ke data Amazon S3 pribadi Anda tanpa mengajukan permintaan melalui proxy. Tujuannya adalah untuk membuat permintaan yang "sudah ditandatangani sebelumnya" dan mengkodekannya sebagai URL yang dapat diambil oleh peramban pengguna akhir. Selain itu, Anda dapat membatasi sebuah permintaan yang telah ditandatangani sebelumnya dengan menentukan waktu kedaluwarsa.
Untuk informasi selengkapnya tentang menggunakan parameter kueri untuk mengotentikasi permintaan, lihat Meng autentikasi Permintaan: Menggunakan Parameter Kueri (Versi AWS Tangan 4) di Referensi API Layanan Penyimpanan Sederhana Amazon. Untuk contoh penggunaan AWS SDK untuk menghasilkan URL yang ditandatangani sebelumnya, lihat Berbagi objek dengan URL yang ditandatangani sebelumnya.
Membuat tanda tangan
Berikut ini adalah contoh permintaan REST Amazon S3 string kueri yang diautentikasi.
GET /photos/puppy.jpg ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Mon, 26 Mar 2007 19:37:58 +0000
Metode autentikasi permintaan string kueri tidak memerlukan header HTTP khusus. Sebaliknya, elemen autentikasi yang diperlukan akan ditentukan sebagai parameter string kueri:
| Nama parameter string kueri | Nilai contoh | Deskripsi |
|---|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
ID kunci AWS akses Anda. Menentukan kunci akses AWS rahasia yang digunakan untuk menandatangani permintaan dan, secara tidak langsung, identitas pengembang yang membuat permintaan. |
Expires |
1141889120 |
Waktu berakhirnya tanda tangan, ditetapkan sebagai jumlah detik sejak epoch (00:00:00 UTC pada tanggal 1 Januari 1970). Permintaan yang diterima setelah waktu ini (berdasarkan waktu server) akan ditolak. |
Signature |
vjbyPxybdZaNmGa%2ByT272YEAiv4%3D |
Pengkodean URL dari pengkodean Base64 HMAC-SHA1 dari StringToSign. |
Metode autentikasi permintaan string kueri sedikit berbeda dari metode biasa tetapi hanya dalam bentuk format dari parameter permintaan Signature dan elemen StringToSign. Berikut ini adalah pseudo-grammar yang mengilustrasikan metode autentikasi permintaan string kueri.
Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Expires + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource;
YourSecretAccessKeyadalah ID kunci akses AWS rahasia yang diberikan Amazon kepada Anda ketika Anda mendaftar untuk menjadi pengembang Amazon Web Service. Perhatikan bagaimana membuatnya cocok untuk penempatan dalam string kueri. Signature URL-Encoded Perhatikan juga bahwa dalam StringToSign, elemen posisi Date HTTP telah diganti dengan Expires. CanonicalizedAmzHeaders dan CanonicalizedResource sama.
catatan
Dalam metode autentikasi string kueri, Anda tidak menggunakan Date atau x-amz-date request saat menghitung string yang akan ditandatangani.
Autentikasi permintaan string kueri
| Permintaan | StringToSign |
|---|---|
|
|
Contoh ini mengasumsikan bahwa ketika browser membuat permintaan GET, itu tidak akan memberikan header Content-MD5 atau Content-Type header, juga tidak akan menyetel header x-amz-, sehingga bagian-bagian tersebut StringToSign dibiarkan kosong.
Menggunakan pengodean Base64
Tanda tangan permintaan HMAC harus dikodekan dengan Base64. Pengodean Base64 mengubah tanda tangan menjadi string ASCII sederhana yang dapat dilampirkan ke permintaan. Karakter yang dapat muncul dalam string tanda tangan seperti tambah (+), garis miring (/), dan sama dengan (=) harus dikodekan jika digunakan dalam URI. Misalnya, jika kode autentikasi menyertakan tanda tambah (+), konversikan kode tersebut sebagai %2B dalam permintaan. Konversikan kode garis miring menjadi %2F dan sama dengan menjadi %3D.
Untuk contoh pengodean Base64, lihat Amazon S3 Contoh-contoh autentikasi.