Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Beberapa Potongan (Unggahan Terpotong) (AWS Versi Tanda Tangan 4)
Seperti dijelaskan dalamGambaran umum, saat mengotentikasi permintaan menggunakan Authorization header, Anda memiliki opsi untuk mengunggah payload dalam potongan. Anda dapat mengirim data dalam ukuran tetap atau potongan ukuran variabel. Bagian ini menjelaskan proses perhitungan tanda tangan dalam unggahan potongan, cara Anda membuat badan potongan, dan cara kerja penandatanganan tertunda di mana Anda pertama kali mengunggah potongan, dan mengirim tanda tangannya di bagian berikutnya. Bagian contoh (lihatContoh: Objek PUT) menunjukkan perhitungan tanda tangan dan Authorization header hasil yang dapat Anda gunakan sebagai rangkaian pengujian untuk memverifikasi kode Anda.
catatan
Saat mentransfer data dalam serangkaian potongan, Anda harus melakukan salah satu dari hal berikut:
-
Secara eksplisit menentukan panjang konten total (panjang objek dalam byte ditambah metadata di setiap potongan) menggunakan header
Content-LengthHTTP. Untuk melakukan ini, Anda harus menghitung terlebih dahulu panjang total payload, termasuk metadata yang Anda kirim di setiap potongan, sebelum memulai permintaan Anda. -
Tentukan header
Transfer-EncodingHTTP. Jika Anda menyertakanTransfer-Encodingheader dan menentukan nilai apa pun selainidentity, Anda harus menghilangkanContent-Lengthheader.
Untuk semua permintaan, Anda harus menyertakan x-amz-decoded-content-length header, menentukan ukuran objek dalam byte.
Setiap perhitungan tanda tangan potongan mencakup tanda tangan dari potongan sebelumnya. Untuk memulai, Anda membuat tanda tangan benih hanya menggunakan header. Anda menggunakan tanda tangan benih dalam perhitungan tanda tangan dari potongan pertama. Untuk setiap potongan berikutnya, Anda membuat tanda tangan potongan yang menyertakan tanda tangan dari potongan sebelumnya. Dengan demikian, tanda tangan potongan dirantai bersama; yaitu, tanda tangan dari potongan n adalah fungsi F (chunk n, signature (chunk n-1)). Rantaian memastikan bahwa Anda mengirim potongan dalam urutan yang benar.
Untuk melakukan unggahan dalam potongan, lakukan hal berikut:
-
Tentukan ukuran potongan muatan. Anda membutuhkan ini ketika Anda menulis kode.
Ukuran potongan harus minimal 8 KB. Kami merekomendasikan ukuran potongan minimal 64 KB untuk kinerja yang lebih baik. Ukuran potongan ini berlaku untuk semua potongan kecuali yang terakhir. Potongan terakhir yang Anda kirim bisa lebih kecil dari 8 KB. Jika muatan Anda kecil dan dapat masuk ke dalam satu potongan, maka itu bisa lebih kecil dari 8 KB.
-
Buat tanda tangan benih untuk dimasukkan dalam potongan pertama. Untuk informasi selengkapnya, lihat Menghitung Tanda Tangan Benih.
-
Buat potongan pertama dan streaming. Untuk informasi selengkapnya, lihat Mendefinisikan Tubuh Potongan.
-
Untuk setiap potongan berikutnya, hitung tanda tangan potongan yang menyertakan tanda tangan sebelumnya dalam string yang Anda tandatangani, buat potongan, dan kirimkan. Untuk informasi selengkapnya, lihat Mendefinisikan Tubuh Potongan.
-
Kirim potongan tambahan terakhir, yang sama dengan potongan lain dalam konstruksi, tetapi memiliki nol byte data. Untuk informasi selengkapnya, lihat Mendefinisikan Tubuh Potongan.
Menghitung Tanda Tangan Benih
Diagram berikut menggambarkan proses penghitungan tanda tangan benih.
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:
pentingUriEncode 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. Berikut ini adalah contoh fungsi UriEncode () di Java.
|
Untuk informasi tentang proses penandatanganan, lihatPerhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Satu Potongan (AWS Versi Tanda Tangan 4). Prosesnya sama, kecuali bahwa penciptaan CanonicalRequest berbeda sebagai berikut:
-
Selain header permintaan yang ingin Anda tambahkan, Anda harus menyertakan header berikut:
Header Deskripsi x-amz-content-sha256Header ini diperlukan untuk semua permintaan AWS Signature Version 4. Tetapkan nilai
STREAMING-AWS4-HMAC-SHA256-PAYLOADuntuk menunjukkan bahwa tanda tangan hanya mencakup header dan tidak ada payload.Content-EncodingAtur nilai ke
aws-chunked.Amazon S3 mendukung beberapa nilai pengkodean konten. Anda dapat menentukan pengkodean konten kustom Anda saat menggunakan API streaming Signature Versi 4.
Contoh:
Content-Encoding : aws-chunked,gzipAmazon S3 menyimpan objek yang dihasilkan tanpa
aws-chunkednilai dicontent-encodingheader. Jikaaws-chunkedmerupakan satu-satunya nilai yang Anda berikan dicontent-encodingheader, S3 menganggapcontent-encodingheader kosong dan tidak mengembalikan header ini saat Anda mengambil objek.x-amz-decoded-content-lengthTetapkan nilai ke panjang, dalam byte, dari data yang akan dipotong, tanpa menghitung metadata apa pun. Misalnya, jika Anda mengunggah file 4 GB, atur nilainya ke 4294967296. Ini adalah ukuran mentah dari objek yang akan diunggah (data yang ingin Anda simpan di Amazon S3). Content-LengthTetapkan nilai ke ukuran aktual dari badan HTTP yang ditransmisikan, yang mencakup panjang data Anda (nilai yang ditetapkan untuk
x-amz-decoded-content-length), ditambah metadata potongan. Setiap potongan memiliki metadata, seperti tanda tangan dari potongan sebelumnya. Perhitungan potongan dibahas di bagian berikut. Jika Anda menyertakanTransfer-Encodingheader dan menentukan nilai apa pun selainidentity, Anda tidak boleh menyertakanContent-Lengthheader.
Anda mengirim potongan pertama dengan tanda tangan benih. Anda harus membangun potongan seperti yang dijelaskan di bagian berikut.
Mendefinisikan Tubuh Potongan
Semua potongan menyertakan beberapa metadata. Setiap potongan harus sesuai dengan struktur berikut:
string(IntHexBase(chunk-size)) + ";chunk-signature=" +signature+ \r\n +chunk-data+ \r\n
Di mana:
-
IntHexBase()adalah fungsi yang Anda tulis untuk mengubah ukuran potongan integer menjadi heksadesimal. Misalnya, jika ukuran potongan adalah 65536, string heksadesimal adalah “10000". -
chunk-sizeadalah ukuran, dalam byte, dari chunk-data, tanpa metadata. Misalnya, jika Anda mengunggah objek 65 KB dan menggunakan ukuran potongan 64 KB, Anda mengunggah data dalam tiga potongan: yang pertama akan menjadi 64 KB, yang kedua 1 KB, dan potongan terakhir dengan 0 byte. -
signatureUntuk setiap potongan, Anda menghitung tanda tangan menggunakan string berikut untuk ditandatangani. Untuk potongan pertama, Anda menggunakan seed-signature sebagai tanda tangan sebelumnya.
Ukuran data potongan akhir yang Anda kirim adalah 0, meskipun tubuh potongan masih berisi metadata, termasuk tanda tangan dari potongan sebelumnya.
Contoh: Objek PUT
Anda dapat menggunakan contoh di bagian ini sebagai referensi untuk memeriksa perhitungan tanda tangan dalam kode Anda. Sebelum Anda meninjau contoh, perhatikan hal berikut:
-
Perhitungan tanda tangan dalam contoh ini menggunakan contoh kredentif keamanan berikut.
Parameter Nilai AWSAccessKeyIdAKIAIOSFODNN7EXAMPLEAWSSecretAccessKeywJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -
Semua contoh menggunakan stempel waktu permintaan 20130524T000000Z ().
Fri, 24 May 2013 00:00:00 GMT -
Semua contoh digunakan
examplebucketsebagai nama bucket. -
Bucket diasumsikan berada di Wilayah AS Timur (Virginia Utara), dan kredenSIAL serta
ScopeSigning Keyperhitungan digunakanus-east-1sebagai penentu Wilayah. Untuk informasi selengkapnya, lihat Wilayah dan Titik Akhir dalam Referensi Umum Amazon Web Services. -
Anda dapat menggunakan gaya jalur atau permintaan gaya yang dihosting virtual. Contoh berikut menggunakan permintaan gaya yang dihosting virtual, misalnya:
https://examplebucket.s3.amazonaws.com/photos/photo1.jpgUntuk informasi selengkapnya, lihat Hosting Virtual Bucket di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.
Contoh berikut mengirimkan PUT permintaan untuk mengunggah objek. Perhitungan tanda tangan mengasumsikan sebagai berikut:
-
Anda mengunggah file teks 65 KB, dan konten file adalah string satu karakter yang terdiri dari huruf 'a'.
-
Ukuran potongan adalah 64 KB. Akibatnya, payload diunggah dalam tiga potongan, 64 KB, 1 KB, dan potongan terakhir dengan 0 byte data potongan.
-
Objek yang dihasilkan memiliki nama kunci
chunkObject.txt. -
Anda meminta
REDUCED_REDUNDANCYsebagai kelas penyimpanan dengan menambahkan headerx-amz-storage-classpermintaan.
Untuk informasi tentang tindakan API, lihat PutObject. Sintaks permintaan umum adalah sebagai berikut:
PUT /examplebucket/chunkObject.txt HTTP/1.1 Host: s3.amazonaws.com x-amz-date: 20130524T000000Z x-amz-storage-class: REDUCED_REDUNDANCY Authorization:SignatureToBeCalculatedx-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD Content-Encoding: aws-chunked x-amz-decoded-content-length: 66560 Content-Length: 66824<Payload>
Langkah-langkah berikut menunjukkan perhitungan tanda tangan.
-
Tanda tangan benih - Buat String untuk Ditandatangani
-
CanonicalRequest
PUT /examplebucket/chunkObject.txt content-encoding:aws-chunked content-length:66824 host:s3.amazonaws.com x-amz-content-sha256:STREAMING-AWS4-HMAC-SHA256-PAYLOAD x-amz-date:20130524T000000Z x-amz-decoded-content-length:66560 x-amz-storage-class:REDUCED_REDUNDANCY content-encoding;content-length;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-storage-class STREAMING-AWS4-HMAC-SHA256-PAYLOADDalam permintaan kanonik, baris ketiga kosong karena tidak ada parameter kueri dalam permintaan. Baris terakhir adalah string konstan yang disediakan sebagai nilai Payload yang di-hash, yang harus sama dengan nilai.
x-amz-content-sha256 header -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request cee3fed04b70f867d036f722359b0b1f2f0e5dc0efadbc082b76c4c60e316455catatan
Untuk informasi tentang setiap baris dalam string yang akan ditandatangani, lihat diagram yang menjelaskan perhitungan tanda tangan benih.
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
Tanda Tangan Benih
4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9 -
Header otorisasi
Header Otorisasi yang dihasilkan adalah sebagai berikut:
AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=content-encoding;content-length;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-storage-class,Signature=4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9 -
Potongan 1: (65536 byte, dengan nilai 97 untuk huruf 'a')
-
Potongan string untuk ditandatangani:
AWS4-HMAC-SHA256-PAYLOAD 20130524T000000Z 20130524/us-east-1/s3/aws4_request 4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 bf718b6f653bebc184e1479f1935b8da974d701b893afcf49e701f3e2f9f9c5acatatan
Untuk informasi tentang setiap baris dalam string yang akan ditandatangani, lihat diagram sebelumnya yang menunjukkan berbagai komponen string yang akan ditandatangani (misalnya, tiga baris terakhir adalah,
previous-signature,hash(""), danhash(current-chunk-data)). -
Tanda tangan potongan:
ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648 -
Data potongan dikirim:
10000;chunk-signature=ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648 <65536-bytes>
-
-
Potongan 2: (1024 byte, dengan nilai 97 untuk huruf 'a')
-
Potongan string untuk ditandatangani:
AWS4-HMAC-SHA256-PAYLOAD 20130524T000000Z 20130524/us-east-1/s3/aws4_request ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a -
Tanda tangan potongan:
0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497 -
Data potongan dikirim:
400;chunk-signature=0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497 <1024 bytes>
-
-
Potongan 3: (0 byte data)
-
Potongan string untuk ditandatangani:
AWS4-HMAC-SHA256-PAYLOAD 20130524T000000Z 20130524/us-east-1/s3/aws4_request 0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -
Tanda tangan potongan:
b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9 -
Data potongan dikirim:
0;chunk-signature=b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9
-