全部产品
Search
文档中心

Object Storage Service:Sertakan tanda tangan V4 di header Authorization (disarankan)

更新时间:Jul 10, 2025

Saat memulai permintaan ke OSS, sertakan header permintaan Authorization yang berisi tanda tangan V4 untuk memastikan otentikasi berhasil. Prioritaskan penggunaan SDK yang disediakan oleh OSS karena SDK tersebut telah mengintegrasikan algoritma tanda tangan V4 yang canggih. Jika SDK tidak dapat digunakan, rujuk pada dokumentasi ini untuk mengimplementasikan algoritma tanda tangan V4 secara manual.

Gunakan SDK OSS untuk mengimplementasikan tanda tangan V4 secara otomatis

Untuk mengimplementasikan algoritma tanda tangan V4, sebaiknya merujuk pada implementasi tanda tangan V4 dalam SDK OSS.

SDK

Implementasi

Java

OSSV4Signer.java

Python

v4.py

Go

v4.go

JavaScript

client.js

PHP

SignerV4.php

C#

SignerV4.cs

Android

OSSV4Signer.java

Swift

SignerV4.swift

Objective-C

OSSV4Signer.m

C++

SignerV4.cc

C

oss_auth.c

Header permintaan Authorization

Saat memulai permintaan ke OSS, Anda harus mengimplementasikan tanda tangan di header Authorization untuk memverifikasi permintaan.

Berikut adalah sintaksis dari header Authorization:

Authorization: OSS4-HMAC-SHA256 Credential=<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request, AdditionalHeaders=<AdditionalHeadersVal>, Signature=<SignatureVal>

Berikut adalah deskripsi dari header Authorization:

Komponen

Deskripsi

OSS4-HMAC-SHA256

Menentukan algoritma yang digunakan untuk menghitung tanda tangan. String ini menentukan versi tanda tangan dan algoritma penandatanganan (HMAC-SHA256). Nilai OSS4-HMAC-SHA256 diperlukan saat menggunakan tanda tangan V4 untuk otentikasi.

Credential

Menentukan ID AccessKey dan ruang lingkup, yang mencakup tanggal, wilayah, dan layanan cloud yang digunakan untuk menghitung tanda tangan. Bidang ini diperlukan saat menggunakan tanda tangan V4 untuk otentikasi.

Berikut adalah sintaksis:

<AccessKeyId>/<SignDate>/<SignRegion>/oss/aliyun_v4_request

Dimana:

  • AccessKeyId: ID AccessKey Anda, yang merupakan pengenal unik yang digunakan untuk memverifikasi identitas peminta.

  • SignDate: Tanggal tanda tangan dalam format YYYYMMDD.

  • SignRegion: ID wilayah yang digunakan untuk permintaan. Contoh: cn-hangzhou.

  • oss: String tetap yang mengidentifikasi layanan yang diminta sebagai Alibaba Cloud Object Storage Service (OSS).

  • aliyun_v4_request: String tetap yang menentukan versi tanda tangan sebagai V4.

AdditionalHeaders

Tentukan header permintaan opsional yang termasuk dalam perhitungan tanda tangan (Anda tidak perlu menentukan header yang wajib termasuk dalam perhitungan tanda tangan). Bidang ini hanya berisi nama header huruf kecil, diurutkan secara leksikografis dan dipisahkan dengan titik koma (;).

Contohnya adalah sebagai berikut:

content-disposition;content-length

Signature

Tanda tangan yang dihitung. Bidang ini diperlukan saat menggunakan tanda tangan V4 untuk otentikasi.

Contoh kode sampel berikut memberikan contoh nilai tanda tangan 256-bit yang direpresentasikan oleh 64 digit heksadesimal huruf kecil:

3938**********************************dcdc

Perhitungan tanda tangan

Setelah menerima permintaan, OSS menghitung tanda tangan dan membandingkannya dengan yang ada di header permintaan Authorization. Jika cocok, permintaan berhasil; jika tidak, permintaan gagal.

Proses perhitungan tanda tangan

Gambar berikut menunjukkan proses perhitungan tanda tangan:

Proses perhitungan tanda tangan terdiri dari tiga langkah berikut:

  1. Buat Permintaan Kanonisasi: Format permintaan sesuai dengan spesifikasi tanda tangan OSS untuk menghasilkan permintaan kanonisasi.

  2. Buat String-to-Sign: Gabungkan permintaan kanonisasi untuk mendapatkan string-to-sign.

  3. Hitung Tanda Tangan: Lakukan operasi hash pada Secret AccessKey untuk menghasilkan kunci turunan, lalu gunakan kunci turunan untuk menghitung string-to-sign dan mendapatkan tanda tangan akhir. Operasi HMAC-SHA256 multi-langkah dilakukan pada Secret AccessKey untuk menghasilkan kunci turunan, yang kemudian digunakan untuk menghitung hash HMAC-SHA256 dari string-to-sign, menghasilkan tanda tangan akhir.

1. Buat permintaan kanonisasi

Berikut adalah sintaksis dari permintaan kanonisasi:

HTTP Verb + "\n" +
Canonical URI + "\n" +
Canonical Query String + "\n" +
Canonical Headers + "\n" +
Additional Headers + "\n" +
Hashed PayLoad

Tabel berikut menjelaskan parameter dalam permintaan kanonisasi:

Parameter

Deskripsi

HTTP Verb

Metode permintaan HTTP, termasuk PUT, GET, POST, HEAD, DELETE, dan OPTIONS.

Canonical URI

Path sumber daya yang di-enkode URI. Path sumber daya tidak termasuk string query, dan encoding untuk garis miring (/) tidak diperlukan.

  • Jika target permintaan adalah OSS, path sumber daya adalah /, dan path sumber daya yang di-enkode URI adalah UriEncode("/").

  • Jika target permintaan adalah bucket, path sumber daya adalah /examplebucket/, dan path sumber daya yang di-enkode URI adalah UriEncode("/examplebucket/").

  • Jika target permintaan adalah objek dalam bucket, path sumber daya adalah /examplebucket/exampleobject, dan path sumber daya yang di-enkode URI adalah UriEncode("/examplebucket/exampleobject").

Canonical Query String

Parameter query yang di-URI-encode diurutkan secara leksikografis.

  • Jika parameter query mencakup nama dan nilai parameter, enkode URI nama dan nilai setiap parameter secara terpisah dan urutkan parameter secara leksikografis berdasarkan nama yang di-enkode. Perhatikan bahwa pengurutan dilakukan setelah encoding. Gunakan = untuk menghubungkan nama dan nilai yang di-enkode, dan gunakan & untuk menggabungkan parameter yang berbeda.

    • Parameter query: prefix=somePrefix&marker=someMarker&max-keys=20

    • Parameter query kanonisasi:

      UriEncode("marker")+"="+UriEncode("someMarker")+"&"+UriEncode("max-keys")+"="+UriEncode("20")+"&"+UriEncode("prefix")+"="+UriEncode("somePrefix")
  • Jika parameter query hanya mencakup nama parameter, lakukan enkode URI pada nama parameter.

    • Parameter query: ?acl

    • Parameter query kanonisasi: UriEncode("acl")

  • Jika tidak ada parameter query, yaitu URI permintaan tidak mengandung ?, string query kanonisasi diatur ke string kosong ("").

Canonical Headers

Daftar header permintaan.

Header permintaan dibagi menjadi tiga kategori:

  • Header yang harus ada dalam permintaan dan termasuk dalam perhitungan tanda tangan:

    • x-oss-content-sha256: hanya UNSIGNED-PAYLOAD yang didukung.

  • Header yang harus termasuk dalam perhitungan tanda tangan jika ada dalam permintaan:

    • Content-Type

    • Content-MD5

    • x-oss-*: Header permintaan lainnya yang dimulai dengan x-oss-. Misalnya, saat mengakses melalui STS AK, SecurityToken dijelaskan melalui x-oss-security-token:security-token. Misalnya, waktu permintaan dijelaskan melalui x-oss-date, dan sintaksisnya harus dalam format waktu ISO8601 standar, seperti 20231203T121212Z.

  • Header permintaan opsional yang ditentukan dalam AdditionalHeaders.

Sintaksisnya adalah sebagai berikut:

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

Contoh kode sampel berikut memberikan contoh:

content-disposition:attachment
content-length:3
content-md5:ICy5YqxZB1uWSwcVLSNLcA==
content-type:text/plain
x-oss-content-sha256:UNSIGNED-PAYLOAD
x-oss-date:20250328T101048Z

Additional Headers

Tentukan header permintaan opsional yang termasuk dalam perhitungan tanda tangan (Anda tidak perlu menentukan header yang wajib termasuk dalam perhitungan tanda tangan). Bidang ini hanya berisi nama header huruf kecil, diurutkan secara leksikografis dan dipisahkan dengan titik koma (;), konsisten dengan AdditionalHeaders.

Tentukan header opsional yang termasuk dalam perhitungan tanda tangan (tidak termasuk header wajib), hanya nama header huruf kecil yang disertakan dan diurutkan secara leksikografis. Mereka dipisahkan oleh titik koma (;) dan konsisten dengan AdditionalHeaders.

Contoh kode sampel berikut memberikan contoh:

content-disposition;content-length

Hashed PayLoad

Representasi heksadesimal dari nilai hash SHA256 payload permintaan. Hanya nilai UNSIGNED-PAYLOAD yang didukung.

2. Buat string-to-sign

Sintaksis dari string-to-sign adalah sebagai berikut:

"OSS4-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
Scope + "\n" +
Hex(SHA256Hash(<CanonicalRequest>))

Tabel berikut menjelaskan parameter dalam string-to-sign:

Parameter

Deskripsi

OSS4-HMAC-SHA256

Algoritma hash dari tanda tangan, nilainya harus OSS4-HMAC-SHA256.

TimeStamp

Waktu UTC saat ini, sintaksisnya harus dalam format ISO8601, seperti 20250320T083322Z.

Scope

Set parameter untuk mendapatkan/mengambil kunci turunan. Set parameter ini menentukan tanggal, wilayah, dan layanan. Oleh karena itu, tanda tangan yang dihitung menggunakan kunci turunan hanya valid untuk tanggal, wilayah, dan layanan yang ditentukan.

Sintaksisnya adalah sebagai berikut:

<SignDate>/<SignRegion>/oss/aliyun_v4_request

Penjelasannya adalah sebagai berikut:

  • SignDate: Tanggal dalam format YYYYMMDD yang termasuk dalam tanda tangan.

  • SignRegion: ID wilayah yang digunakan untuk tanda tangan, seperti cn-hangzhou.

  • oss: Nama layanan yang termasuk dalam tanda tangan, tetap sebagai oss.

  • aliyun_v4_request: Versi yang termasuk dalam tanda tangan, tetap sebagai aliyun_v4_request.

CanonicalRequest

Permintaan kanonisasi yang telah dibuat.

3. Hitung tanda tangan

Menghitung tanda tangan melibatkan dua langkah berikut:

  1. Hitung SigningKey.

    DateKey = HMAC-SHA256("aliyun_v4" + SK, Date);
    DateRegionKey = HMAC-SHA256(DateKey, Region);
    DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss");
    SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request");
    • SK: AccessKey Secret yang termasuk dalam tanda tangan.

    • Date: Tanggal dalam format YYYYMMDD yang termasuk dalam tanda tangan, yang harus konsisten dengan SignDate dalam string-to-sign.

    • Region: ID wilayah yang digunakan untuk tanda tangan, seperti cn-hangzhou, yang harus konsisten dengan SignRegion dalam string-to-sign.

  2. Hitung Signature menggunakan SigningKey dan string-to-sign.

    Signature = HEX(HMAC-SHA256(SigningKey, StringToSign))

Contoh perhitungan tanda tangan

Contoh berikut menunjukkan cara menghitung tanda tangan dengan memanggil operasi PutObject.

Parameter untuk perhitungan tanda tangan

Parameter

Nilai

AccessKeyId

LTAI****************

AccessKeySecret

yourAccessKeySecret

Timestamp

20250411T064124Z

Bucket

examplebucket

Object

exampleobject

Region

cn-hangzhou

Contoh perhitungan tanda tangan

  1. Buat permintaan kanonisasi.

    PUT
    /examplebucket/exampleobject
    
    content-disposition:attachment
    content-length:3
    content-md5:ICy5YqxZB1uWSwcVLSNLcA==
    content-type:text/plain
    x-oss-content-sha256:UNSIGNED-PAYLOAD
    x-oss-date:20250411T064124Z
    
    content-disposition;content-length
    UNSIGNED-PAYLOAD
  2. Buat string-to-sign.

    OSS4-HMAC-SHA256
    20250411T064124Z
    20250411/cn-hangzhou/oss/aliyun_v4_request
    c46d96390bdbc2d739ac9363293ae9d710b14e48081fcb22cd8ad54b63136eca
  3. Hitung tanda tangan.

    1. Hitung SigningKey.

      Catatan

      Untuk kemudahan pembacaan, SigningKey berikut ditampilkan dalam format heksadesimal.

      3543b7686e65eda71e5e5ca19d548d78423c37e8ddba4dc9d83f90228b457c76
    2. Hitung Signature.

      053edbf550ebd239b32a9cdfd93b0b2b3f2d223083aa61f75e9ac16856d61f23