Penggunaan fungsi HMACSHA1 pada PHP

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

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 lebih lanjut, kunjungi Permintaan Autentikasi (Tanda Tangan AWS Versi 4) di Referensi API Amazon Simple Storage Service.

Autentikasi adalah proses pembuktian identitas Anda pada sistem. Identitas adalah faktor penting dalam keputusan kontrol akses Amazon S3. Permintaan diperbolehkan atau ditolak sebagian berdasarkan identitas pemohon. Sebagai contoh, hak untuk membuat ember diperuntukkan bagi pengembang terdaftar dan (secara bawaan) hak untuk membuat objek dalam ember diperuntukkan bagi pemilik ember yang dimaksud. Sebagai pengembang, Anda akan membuat permintaan yang memerlukan hak istimewa ini, jadi Anda perlu membuktikan identitas Anda pada sistem dengan melakukan autentikasi atas permintaan Anda. Dalam bagian ini, akan ditunjukkan caranya.

Konten dalam bagian ini tidak berlaku untuk HTTP POST. Untuk informasi selengkapnya, lihat Unggahan berbasis peramban menggunakan POST (Tanda tangan AWS versi 2).

REST API Amazon S3 menggunakan skema HTTP kustom berdasarkan kunci-HMAC (Kode Autentikasi Pesan Hash) untuk autentikasi. Untuk mengautentikasi permintaan, Anda pertama kali perlu menggabungkan elemen-elemen yang dipilih dari permintaan untuk membentuk string. Kemudian, Anda harus menggunakan secret access key AWS untuk menghitung HMAC pada string tersebut. Secara aktual, kami menyebut proses ini “menandatangani permintaan”, dan kami menyebut outputnya tanda tangan algoritme HMAC, karena ia mensimulasikan sifat pengaman sebagaimana tanda tangan asli. Terakhir, Anda perlu menambahkan tanda tangan ini sebagai parameter permintaan dengan menggunakan sintaks yang dijelaskan dalam bagian ini.

Saat sistem menerima permintaan yang telah diautentikasi, sistem akan mengambil secret access key AWS yang Anda klaim dan menggunakannya dengan cara yang sama untuk menghitung tanda tangan untuk pesan yang diterima. Kemudian, sistem akan membandingkan tanda tangan yang dihitung dengan tanda tangan yang diberikan oleh pemohon. Jika kedua tanda tangan cocok, maka sistem akan menyimpulkan bahwa peminta harus memiliki akses ke secret access key AWS dan oleh karena itu sistem bertindak dengan otoritas utama yang untuknya kunci tersebut dikeluarkan. Jika kedua tanda tangan tersebut tidak cocok, maka permintaan akan dibuang dan sistem merespons dengan pesan kesalahan.

contoh Permintaan Amazon S3 REST 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 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=

Menggunakan kredensial keamanan sementara

Jika Anda menandatangani permintaan Anda menggunakan kredensial keamanan sementara (lihat Membuat permintaan), Anda harus menyertakan token keamanan yang sesuai dalam permintaan Anda dengan menambahkan


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
4 header.

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


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
4 header saat Anda mengirim permintaan ke Amazon S3. Untuk informasi tentang API AWS Security Token Service yang disediakan oleh IAM, masuk ke Tindakan di AWS Security Token Service Panduan Referensi API .

REST API Amazon S3 menggunakan


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
6 header HTTP standar untuk memberikan informasi autentikasi. (Nama header standar tidak valid karena memuat informasi autentikasi, bukan otorisasi.) Berdasarkan skema autentikasi Amazon S3, header Otorisasi memiliki bentuk berikut ini:

Authorization: AWS AWSAccessKeyId:Signature

Developer menerbitkan access key ID AWS dan secret access key AWS saat mereka mendaftar. Untuk autentikasi permintaan, elemen


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
7 mengidentifikasi ID kunci akses yang digunakan untuk menghitung tanda tangan dan, secara tidak langsung, juga mengidentifikasi pengembang yang mengajukan permintaan.

Elemen


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 adalah RFC 2104 HMAC-SHA1 dari elemen-elemen yang dipilih dari permintaan, sehingga bagian

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 header Otorisasi akan berbeda-beda untuk setiap permintaan. Jika tanda tangan permintaan yang dihitung oleh sistem sesuai dengan

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 yang disertakan dalam permintaan, maka peminta akan menunjukkan kepemilikan secret access key AWS. Permintaan tersebut kemudian akan diproses berdasarkan identitas tersebut, dan dengan otoritas, dari pengembang yang untuknya kunci tersebut dikeluarkan.

Berikut ini adalah pseudogrammar yang mengilustrasikan konstruksi


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
6 judul permintaan. (Dalam contoh,
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
2 berarti titik kode Unicode
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
3, 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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 

HMAC-SHA1 adalah algoritme yang ditentukan oleh RFC 2104 - Keyed-Hashing untuk Autentikasi Pesan. algoritme dianggap sebagai input dua string byte, kunci dan pesan. Untuk autentikasi permintaan Amazon S3, gunakan secret access key AWS (

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
4) sebagai kunci, dan pengkodean UTF-8
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 sebagai pesan. Output HMAC-SHA1 juga merupakan string byte, yang disebut intisari.

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 parameter permintaan dibangun berdasarkan Base64 yang mengkodekan intisari ini.

Ingatlah bahwa ketika sistem menerima permintaan yang diautentikasi, sistem tersebut membandingkan tanda tangan permintaan yang dikomputasi dengan tanda tangan yang disertakan dalam permintaan di

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5. Karena alasan tersebut, Anda harus melakukan komputasi tanda tangan dengan menggunakan metode yang sama seperti yang digunakan oleh Amazon S3. Kami menyebut proses permohonan dalam bentuk yang telah disetujui untuk penandatanganan sebagai kanonikalisasi.

Membuat CanonicalizedResource elemen

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 mewakili sumber daya Amazon S3 yang ditarget oleh permintaan. Buat elemen permintaan REST sebagai berikut:

1

Mulailah dengan string kosong (

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
9).

2

Jika permintaan menetapkan ember untuk menggunakan header Host HTTP (gaya hosting virtual), tambahkan nama ember di awal

GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg
0 (misalnya, “/nama ember”). Untuk permintaan dan permintaan gaya jalur yang tidak menyebutkan kategori, jangan lakukan apa pun. Untuk informasi lebih lanjut tentang permintaan gaya hosting virtual, lihat Bucket dengan hosting virtual.

Untuk permintaan gaya hosting virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg",

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 adalah “/awsexamplebucket1”.

Untuk permintaan gaya jalur, “https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg",

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 adalah "".

3

Tambahkan bagian alur dari URI Permintaan HTTP yang tidak di-decoding, hingga tetapi tidak termasuk string kueri.

Untuk permintaan gaya hosting virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg",

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 adalah “/awsexamplebucket1/photos/puppy.jpg”.

Untuk permintaan gaya jalur, “https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg",

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 adalah “/awsexamplebucket1/photos/puppy.jpg”. Pada titik ini,
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 sama, baik untuk permintaan gaya hosting virtual dan permintaan gaya jalur.

Untuk permintaan yang tidak menyebutkan kategori, misalnya DAPATKAN Layanan, tambahkan “/”.

4

Jika permintaan membahas sub-sumber daya, seperti

GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg
6,
GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg
7,
GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg
8,
GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9, atau
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
0 tambahkan sub-sumber dayanya, nilainya, jika ada, dan tanda tanya. Perhatikan bahwa jika terdapat beberapa sub-sumber daya, maka sub-sumber daya tersebut harus secara diurutkan leksikografis berdasarkan nama sub-sumber daya dan dipisahkan oleh '&', e.g., ?acl&versionId=
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
1.

Sub-sumber daya yang harus dimasukkan ketika membangun CanonicalizedResource elemen adalah acl, siklus hidup, lokasi, logging, pemberitahuan, partNumber, kebijakan, requestPayment, uploadId, versi, dan situs web.

Jika permintaan menetapkan parameter string kueri yang menolak 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 termasuk

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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
2,
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
3,
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
4,
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
5,
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
6, dan
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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
7.

Parameter string

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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")
8 kueri harus disertakan saat Anda membuat permintaan Hapus atas beberapa objek. CanonicalizedResource

Elemen CanonicalizedResource yang berasal dari URI Permintaan HTTP harus benar-benar ditandatangani sebagaimana yang muncul dalam permintaan HTTP, termasuk karakter meta Encoding URL.

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 mungkin berbeda dengan URI Permintaan HTTP. Khususnya, jika permintaan Anda menggunakan
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
0 header HTTP untuk menetapkan ember, maka ember tidak akan muncul dalam URI Permintaan HTTP. Namun,
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 harus tetap menyertakan ember. Parameter string kueri mungkin juga muncul dalam URI Permintaan tetapi tidak disertakan dalam
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8. Untuk informasi selengkapnya, lihat Bucket dengan hosting virtual.

Untuk membuat CanonicalizedAmzHeaders bagian dari

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5, pilih semua header permintaan HTTP yang dimulai dengan 'x-amz-' (menggunakan perbandingan huruf besar kecil), dan gunakan proses berikut.

1Ubah setiap nama header HTTP menjadi huruf kecil. Misalnya, '

PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
4' menjadi '
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5'.2Urutkan pengumpulan header secara leksikografis berdasarkan nama header.3Gabungkan kolom header dengan nama yang sama menjadi satu pasangan “comma-separated-value-listnama-kepala:” sebagaimana yang ditentukan dalam RFC 2616, bagian 4.2, tanpa spasi antar nilai. Misalnya, dua metadata header ”
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
6' dan '
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
7' akan digabungkan ke dalam header tunggal '
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
8'.4Header panjang “Unfold” yang mencakup beberapa baris (sebagaimana yang diizinkan oleh RFC 2616, bagian 4.2) dengan mengganti spasi terlipat (termasuk baris baru) dengan satu spasi.5Perkecil setiap spasi di sekitar titik dua yang ada dalam header. Contohnya, header '
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
8' akan menjadi '
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
0'6Terakhir, tambahkan karakter baris baru (
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
3) untuk setiap header kanonikalisasi dalam daftar hasil. Membuat elemen CanonicalizedResource dengan menggabungkan semua header dalam daftar ini menjadi satu string tunggal.

Beberapa elemen header pertama

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 (Tipe-Konten, Tanggal, dan Konten-MD5) bersifat posisi.
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 tidak menyertakan nama-nama dari header ini, hanya nilai-nilainya saja dari permintaan. Sebaliknya, elemen '
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
4' diberi nama. Baik nama header dan nilai header muncul di
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5.

Jika header posisi yang disebutkan dalam definisi

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 tidak ada dalam permintaan Anda (misalnya,
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
7 atau
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
8 bersifat opsional untuk permintaan LETAKKAN dan tidak berarti untuk permintaan DAPATKAN), ganti string kosong ("") untuk posisi tersebut.

Stempel waktu yang valid (baik menggunakan header HTTP

PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 atau alternatif
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5) 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
GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1
User-Agent: Mozilla/5.0
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 19:42:41 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
m0WP8eCtspQl5Ahe6L1SozdX9YA=
1. Tujuan dari pembatasan ini adalah untuk membatasi kemungkinan bahwa permintaan yang terpotong dapat diputar ulang oleh lawannya. Untuk perlindungan yang lebih kuat terhadap penguping, gunakan transportasi HTTPS untuk permintaan yang diautentikasi.

Batasan validasi pada tanggal permintaan hanya berlaku untuk permintaan yang diautentikasi yang tidak menggunakan autentikasi string kueri. Untuk informasi selengkapnya, lihat .

Beberapa pustaka klien HTTP tidak memaparkan kemampuan untuk mengatur header

PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 untuk permintaan. Jika Anda mengalami masalah saat menyertakan nilai header 'Tanggal' di header kanonikalisasi, Anda dapat mengatur stempel waktu untuk permintaan dengan menggunakan header '
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5' sebagai gantinya. Nilai dari header
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5 harus dalam salah satu format RFC 2616 (http://www.ietf.org/rfc/rfc2616.txt). Saat header
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5 ada dalam permintaan, maka sistem akan mengabaikan header
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 saat melakukan komputasi tanda tangan permintaan. Oleh karena itu, jika Anda menyertakan header
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5, gunakan string kosong untuk
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 saat membangun
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5. Lihat bagian berikut untuk contoh.

Contoh-contoh dalam bagian ini menggunakan kredensial (nonkerja) dalam tabel berikut.

ParameterNilaiAWSAccessKeyId

GET\n
\n
\n
Tue, 27 Mar 2007 19:42:41 +0000\n
/awsexamplebucket1/
0AWSSecretAccessKey
GET\n
\n
\n
Tue, 27 Mar 2007 19:42:41 +0000\n
/awsexamplebucket1/
1

Dalam contoh

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5, format tidak signifikan, dan
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
2 berarti titik kode Unicode
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
3 yang biasanya disebut sebagai baris baru. Selain itu, contoh-contoh tersebut menggunakan “+0000” untuk menentukan zona waktu. Anda dapat menggunakan “GMT” untuk menentukan zona waktu, tetapi tanda tangan yang ditunjukkan dalam contoh-contoh itu akan berbeda.

Contoh-contoh ini mendapatkan objek dari ember awsexamplebucket1.

PermintaanStringToSign

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/awsexamplebucket1/photos/puppy.jpg

Perhatikan bahwa nama ember CanonicalizedResource menyertakannya, tetapi URI Permintaan HTTP tidak menyertakannya. (ember ditentukan berdasarkan header Host.)

Naskah Python berikut menghitung tanda tangan yang terdahulu, menggunakan parameter yang telah disediakan. Anda dapat menggunakan skrip ini untuk membuat tanda tangan Anda sendiri, mengganti kunci dan jika StringToSign sesuai.

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.encodestring(
                                hmac.new(
                                         secret_key, string_to_sign, sha1
                                         ).digest()
                                ).strip()


print(f"AWS {access_key.decode()}:{signature.decode()}")

Contoh ini menempatkan sebuah objek ke dalam ember awsexamplecket1.

PermintaanStringToSign

PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg

Perhatikan header Tipe-Konten dalam permintaan dan di StringToSign. Perhatikan juga bahwa Konten-MD5 dibiarkan kosong di StringToSign, karena ia memang tidak ada dalam permintaan.

Contoh ini mencantumkan konten dari ember awsexamplebucket1.

PermintaanStringToSign

GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1
User-Agent: Mozilla/5.0
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 19:42:41 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
m0WP8eCtspQl5Ahe6L1SozdX9YA=
GET\n
\n
\n
Tue, 27 Mar 2007 19:42:41 +0000\n
/awsexamplebucket1/

Perhatikan garis miring yang tertinggal pada CanonicalizedResource dan tidak adanya parameter string kueri.

Contoh ini mengambil sub-sumber daya kebijakan kontrol akses untuk ember 'awsexamplebucket1'.

PermintaanStringToSign

Authorization: AWS AWSAccessKeyId:Signature
0
Authorization: AWS AWSAccessKeyId:Signature
1

Perhatikan bagaimana parameter string kueri sub-sumber daya disertakan di CanonicalizedResource.

Contoh ini menghapus objek dari ember 'awsexamplebucket1' menggunakan model-jalur dan Tanggal sebagai alternatifnya.

PermintaanStringToSign

Authorization: AWS AWSAccessKeyId:Signature
2
Authorization: AWS AWSAccessKeyId:Signature
3

Perhatikan bagaimana kami menggunakan metode alternatif 'x-amz-date' untuk menentukan tanggal (karena pustaka klien kami mencegah kami menetapkan tanggal, katakanlah begitu). Dalam kasus ini,

PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5 lebih diutamakan dari header
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9. Oleh karena itu, entri tanggal pada tanda tangan harus berisi nilai header
PUT /photos/puppy.jpg HTTP/1.1
Content-Type: image/jpeg
Content-Length: 94328
Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
Date: Tue, 27 Mar 2007 21:15:45 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
iqRzw+ileNPu1fhspnRs8nOjjIA=
5.

Contoh ini mengunggah objek ke ember dengan gaya hosting virtual CNAME dengan metadata.

PermintaanStringToSign

Authorization: AWS AWSAccessKeyId:Signature
4
Authorization: AWS AWSAccessKeyId:Signature
5

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

PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
7 dan
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
8 yang muncul di
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5. Header entitas
Authorization: AWS AWSAccessKeyId:Signature
01 tidak muncul.

Sekali lagi, perhatikan bahwa

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 menyertakan nama ember, tetapi URI Permintaan HTTP tidak menyertakannya. (ember ditentukan berdasarkan header Host.)

PermintaanStringToSign

Authorization: AWS AWSAccessKeyId:Signature
6
Authorization: AWS AWSAccessKeyId:Signature
7

PermintaanStringToSign

Authorization: AWS AWSAccessKeyId:Signature
8
Authorization: AWS AWSAccessKeyId:Signature
9

Elemen dalam

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 yang berasal dari URI Permintaan benar-benar diambil, termasuk URL-Encoding dan kapitalisasi.

Saat autentikasi permintaan REST gagal, sistem akan merespons permintaan tersebut dengan dokumen kesalahan XML. Informasi yang terkandung dalam dokumen kesalahan ini ditujukan untuk membantu pengembang melakukan diagnosis masalah. Secara khusus, elemen

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 dari dokumen kesalahan
Authorization: AWS AWSAccessKeyId:Signature
05 memberi tahu Anda dengan tepat kanonikalisisasi permintaan yang digunakan oleh sistem.

Beberapa toolkit diam-diam memasukkan header yang tidak Anda ketahui sebelumnya, misalnya menambahkan header

PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
7 selama PUT. Dalam sebagian besar kasus ini, nilai header yang dimasukkan tetap konstan, memungkinkan Anda untuk menemukan header yang hilang dengan menggunakan alat seperti Ethereal atau tcpmon.

Anda dapat melakukan autentikasi atas jenis permintaan tertentu dengan menyampaikan informasi yang diperlukan sebagai parameter string kueri bukannya dengan menggunakan header HTTP


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
6. Hali ini berguna untuk mengaktifkan akses peramban pihak ketiga langsung ke data Amazon S3 pribadi Anda tanpa mengajukan permintaan melalui proxy. Gagasannya adalah untuk membuat permintaan “yang telah ditandatangani sebelumnya” dan mengodekannya sebagai URL yang dapat diambil oleh peramban pengguna akhir. Selain itu, Anda dapat membatasi sebuah permintaan yang telah ditandatangani sebelumnya dengan menyebutkan waktu kedaluwarsa.

Untuk informasi lebih lanjut mengenai penggunaan parameter kueri untuk melakukan autentikasi permintaan, lihat Melakukan Autentikasi Permintaan: Menggunakan Parameter Kueri (AWSSignature Version 4) di Referensi API Amazon Simple Storage Service. Sebagai contoh penggunaan SDK AWS untuk membuat URL yang telah ditandatangani sebelumnya, lihat Berbagi objek menggunakan URL yang telah ditandatangani.

Membuat tanda tangan

Berikut ini adalah contoh permintaan REST Amazon S3 string kueri yang diautentikasi.


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
0

Metode autentikasi permintaan string kueri tidak memerlukan header HTTP khusus. Sebaliknya, elemen autentikasi yang diperlukan ditentukan sebagai parameter string kueri:

Nama parameter string kueriNilai contohDeskripsi


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
7
GET\n
\n
\n
Tue, 27 Mar 2007 19:42:41 +0000\n
/awsexamplebucket1/
0Access key ID AWS Anda. Menentukan secret access key AWS yang digunakan untuk menandatangani permintaan dan, secara tidak langsung, identitas developer yang mengajukan permintaan tersebut.
Authorization: AWS AWSAccessKeyId:Signature
10
Authorization: AWS AWSAccessKeyId:Signature
11Waktu saat tanda tangan berakhir, yang ditentukan dalam detik sejak jangka waktunya (00:00:00 UTC pada 1 Januari 1970). Permintaan yang diterima setelah waktu ini (berdasarkan waktu server) akan ditolak.

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8
Authorization: AWS AWSAccessKeyId:Signature
13Encoding URL untuk encoding Base64 HMAC-SHA1 dari StringToSign.

Metode autentikasi permintaan string kueri sedikit berbeda dari metode biasa tetapi hanya dalam bentuk format dari parameter permintaan


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 dan elemen
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 lainnya. Berikut ini adalah pseudo-grammar yang mengilustrasikan metode autentikasi permintaan string kueri.


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
1

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
4 adalah secret access key ID AWS yang ditugaskan Amazon kepada Anda saat mendaftar menjadi developer Amazon Web Service. Perhatikan bagaimana

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
8 di-encoding-URL untuk membuatnya sesuai untuk penempatan dalam string kueri. Perhatikan juga bahwa dalam
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5, elemen posisi
PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 HTTP telah diganti dengan
Authorization: AWS AWSAccessKeyId:Signature
10.
Authorization: AWS AWSAccessKeyId:Signature
21 dan
GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
8 sama.

Dalam metode autentikasi string kueri, Anda tidak menggunakan

PUT\n
\n
image/jpeg\n
Tue, 27 Mar 2007 21:15:45 +0000\n
/awsexamplebucket1/photos/puppy.jpg
9 atau
Authorization: AWS AWSAccessKeyId:Signature
24 saat menghitung string yang akan ditandatangani.

Autentikasi permintaan string kueri

PermintaanStringToSign


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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
2

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 ] +
	 +
	[ subresource, if present. For example "?acl", "?location", or "?logging"];

CanonicalizedAmzHeaders = 
3

Kami menganggap bahwa ketika peramban membuat permintaan DAPATKAN, peramban tidak akan menyediakan header Konten-MD5 atau header Jenis Konten, dan tidak akan mengatur header x-amz-, sehingga bagian-bagian dari

GET /photos/puppy.jpg HTTP/1.1
Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
Date: Tue, 27 Mar 2007 19:36:42 +0000

Authorization: AWS AKIAIOSFODNN7EXAMPLE:
qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
5 dibiarkan kosong.

Tanda tangan permintaan HMAC harus dengan encoding Base64. Encoding Base64 mengonversi tanda tangan menjadi string ASCII sederhana yang dapat dilampirkan pada permintaan. Karakter yang dapat muncul dalam string tanda tangan seperti plus (+), garis miring (/), dan sama dengan (=) harus diencoding jika digunakan dalam URI. Sebagai contoh, jika kode autentikasi menyertakan tanda plus (+), encoding kode tersebut menjadi %2B dalam permintaan. Encoding garis miring menjadi %2F dan sama dengan menjadi %3D.