View a markdown version of this page

Perhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Beberapa Potongan (Unggahan Terpotong) (AWS Versi Tanda Tangan 4) - Amazon Simple Storage Service

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-Length HTTP. Untuk melakukan ini, Anda harus menghitung terlebih dahulu panjang total payload, termasuk metadata yang Anda kirim di setiap potongan, sebelum memulai permintaan Anda.

  • Tentukan header Transfer-Encoding HTTP. Jika Anda menyertakan Transfer-Encoding header dan menentukan nilai apa pun selainidentity, Anda harus menghilangkan Content-Length header.

Untuk semua permintaan, Anda harus menyertakan x-amz-decoded-content-length header, menentukan ukuran objek dalam byte.

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

Untuk melakukan unggahan dalam potongan, lakukan hal berikut:

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

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

  2. Buat tanda tangan benih untuk dimasukkan dalam potongan pertama. Untuk informasi selengkapnya, lihat Menghitung Tanda Tangan Benih.

  3. Buat potongan pertama dan streaming. Untuk informasi selengkapnya, lihat Mendefinisikan Tubuh Potongan.

  4. 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.

  5. 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.

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:

  • URI mengkodekan setiap byte kecuali karakter tanpa syarat: 'A'-'Z', 'a'-'z', '0'-'9', '-', ' . ',' _ ', dan '~'.

  • Karakter spasi adalah karakter yang dicadangkan dan harus dikodekan sebagai “%20" (dan bukan sebagai “+”).

  • Setiap byte yang dikodekan URI dibentuk oleh '%' dan nilai heksadesimal dua digit byte.

  • Huruf dalam nilai heksadesimal harus huruf besar, misalnya “%1A”.

  • Enkode karakter garis miring ke depan, '/', di mana-mana kecuali dalam nama kunci objek. Misalnya, jika nama kunci objek adalahphotos/Jan/sample.jpg, garis miring ke depan dalam nama kunci tidak dikodekan.

penting

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.

Berikut ini adalah contoh fungsi UriEncode () di Java.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

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-sha256

    Header ini diperlukan untuk semua permintaan AWS Signature Version 4. Tetapkan nilai STREAMING-AWS4-HMAC-SHA256-PAYLOAD untuk menunjukkan bahwa tanda tangan hanya mencakup header dan tidak ada payload.

    Content-Encoding

    Atur 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,gzip

    Amazon S3 menyimpan objek yang dihasilkan tanpa aws-chunked nilai di content-encoding header. Jika aws-chunked merupakan satu-satunya nilai yang Anda berikan di content-encoding header, S3 menganggap content-encoding header kosong dan tidak mengembalikan header ini saat Anda mengambil objek.

    x-amz-decoded-content-length Tetapkan 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-Length

    Tetapkan nilai ke ukuran aktual dari badan HTTP yang ditransmisikan, yang mencakup panjang data Anda (nilai yang ditetapkan untukx-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 menyertakan Transfer-Encoding header dan menentukan nilai apa pun selainidentity, Anda tidak boleh menyertakan Content-Length header.

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.

    Proses penghitungan tanda tangan benih yang menunjukkan berbagai komponen string yang akan ditandatangani.

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
    AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
    AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  • Semua contoh menggunakan stempel waktu permintaan 20130524T000000Z (). Fri, 24 May 2013 00:00:00 GMT

  • Semua contoh digunakan examplebucket sebagai nama bucket.

  • Bucket diasumsikan berada di Wilayah AS Timur (Virginia Utara), dan kredenSIAL serta Scope Signing Key perhitungan digunakan us-east-1 sebagai penentu Wilayah. Untuk informasi selengkapnya, lihat Wilayah dan Titik Akhir dalam Referensi Umum Amazon Web Services.

  • Anda dapat menggunakan gaya jalur atau permintaan gaya yang dihosting virtual. Contoh berikut menggunakan permintaan gaya yang dihosting virtual, misalnya:

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

    Untuk informasi selengkapnya, lihat Hosting Virtual Bucket 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 kuncichunkObject.txt.

  • Anda meminta REDUCED_REDUNDANCY sebagai kelas penyimpanan dengan menambahkan header x-amz-storage-class permintaan.

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: SignatureToBeCalculated x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD Content-Encoding: aws-chunked x-amz-decoded-content-length: 66560 Content-Length: 66824 <Payload>

Langkah-langkah berikut menunjukkan perhitungan tanda tangan.

  1. Tanda tangan benih - Buat String untuk Ditandatangani
    1. CanonicalRequest

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

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

    2. StringToSign

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

      catatan

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

  2. SigningKey

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

  3. Tanda Tangan Benih

    4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9

  4. 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

  5. Potongan 1: (65536 byte, dengan nilai 97 untuk huruf 'a')
    1. Potongan string untuk ditandatangani:

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

      catatan

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

    2. Tanda tangan potongan:

      ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648
    3. Data potongan dikirim:

      10000;chunk-signature=ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648 <65536-bytes>
  6. Potongan 2: (1024 byte, dengan nilai 97 untuk huruf 'a')
    1. Potongan string untuk ditandatangani:

      AWS4-HMAC-SHA256-PAYLOAD 20130524T000000Z 20130524/us-east-1/s3/aws4_request ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 2edc986847e209b4016e141a6dc8716d3207350f416969382d431539bf292e4a
    2. Tanda tangan potongan:

      0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497
    3. Data potongan dikirim:

      400;chunk-signature=0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497 <1024 bytes>
  7. Potongan 3: (0 byte data)
    1. Potongan string untuk ditandatangani:

      AWS4-HMAC-SHA256-PAYLOAD 20130524T000000Z 20130524/us-east-1/s3/aws4_request 0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    2. Tanda tangan potongan:

      b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9
    3. Data potongan dikirim:

      0;chunk-signature=b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9