全部产品
Search
文档中心

Object Storage Service:Tanda tangan POST V1

更新时间:Mar 07, 2026

Saat menggunakan operasi PostObject untuk mengunggah file, Object Storage Service (OSS) mewajibkan setiap permintaan unggah menyertakan tanda tangan demi keamanan. Pada tanda tangan POST V1, tanda tangan dihitung dengan menggunakan AccessKey secret untuk menandatangani string yang berisi parameter permintaan, seperti kebijakan unggah dan waktu kedaluwarsa. Server aplikasi menghasilkan tanda tangan tersebut dan memberikannya kepada klien bersama kebijakan unggah. Klien kemudian menggunakan informasi ini untuk menyusun permintaan unggah. Saat OSS menerima permintaan tersebut, OSS mengotentikasi tanda tangannya dan hanya menerima permintaan dengan tanda tangan yang valid; permintaan lainnya ditolak.

Penting

OSS mendukung algoritma tanda tangan V4 yang lebih aman. Untuk keamanan yang lebih baik, kami menyarankan Anda menggunakan tanda tangan V4. Untuk informasi selengkapnya, lihat V4 signature.

Pengenalan tanda tangan POST

Permintaan HTTP POST mendukung algoritma tanda tangan V1. Formulir dan kebijakan memainkan peran penting dalam memastikan keamanan serta kepatuhan permintaan unggah.

Formulir

Formulir adalah kumpulan bidang dalam permintaan POST yang digunakan untuk mengirimkan file dan metadata terkaitnya. Elemen formulir berikut ini khusus untuk tanda tangan POST V1. Untuk informasi tentang elemen formulir umum lainnya, lihat PostObject form elements.

Bidang

Type

Deskripsi

OSSAccessKeyId

String

ID AccessKey dari Pasangan Kunci Akses.

Nilai default: Tidak ada

    Penting
    • Sediakan bidang formulir OSSAccessKeyId jika daftar kontrol akses (ACL) bucket bersifat public-read atau private.

    • Sediakan bidang formulir OSSAccessKeyId jika bidang formulir Signature dan policy tersedia.

Signature

String

Tanda tangan yang dihitung dari AccessKey secret dan policy. OSS menggunakan tanda tangan ini untuk mengotentikasi permintaan POST. Untuk informasi selengkapnya, lihat PostObject.

Nilai default: Tidak ada

Penting
  • Sediakan bidang formulir Signature jika ACL bucket bersifat public-read atau private.

  • Sediakan bidang formulir Signature jika bidang formulir OSSAccessKeyId dan policy tersedia.

  • Kunci untuk bidang formulir ini tidak peka huruf besar/kecil, tetapi nilainya peka huruf besar/kecil.

policy

Bidang formulir policy adalah kebijakan keamanan yang menentukan izin dan batasan untuk mengunggah file ke OSS melalui formulir HTML. Kebijakan ini didefinisikan dalam format JSON dan membatasi operasi unggah berdasarkan parameter seperti nama bucket yang diizinkan, awalan objek, waktu kedaluwarsa, metode HTTP yang diizinkan, batas ukuran konten, dan batas tipe konten.

Penting

Kebijakan harus mencakup bidang expiration dan conditions.

{
  "expiration": "2023-12-03T13:00:00.000Z",
  "conditions": [
    {"bucket": "examplebucket"},
    ["content-length-range", 1, 10],
    ["eq", "$success_action_status", "201"],
    ["starts-with", "$key", "user/eric/"],
    ["in", "$content-type", ["image/jpg", "image/png"]],
    ["not-in", "$cache-control", ["no-cache"]]
  ]
}

Kebijakan berisi elemen-elemen berikut:

  • expiration

    Menentukan waktu kedaluwarsa kebijakan dalam format ISO 8601 GMT. Misalnya, 2023-12-03T13:00:00.000Z berarti permintaan POST harus diajukan sebelum pukul 13.00 pada 3 Desember 2023.

  • conditions

    Menentukan nilai yang valid untuk bidang formulir dalam permintaan POST.

    Bidang

    Jenis

    Wajib

    Deskripsi

    Mode pencocokan kondisi

    bucket

    String

    Tidak

    Nama bucket.

    bucket

    content-length-range

    String

    Tidak

    Ukuran minimum dan maksimum objek yang diizinkan untuk diunggah, dalam byte.

    content-length-range

    success_action_status

    String

    Tidak

    Kode status yang dikembalikan setelah unggahan berhasil.

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    key

    String

    Tidak

    Nama objek yang akan diunggah.

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    content-type

    String

    Tidak

    Membatasi jenis file yang diunggah.

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

    cache-control

    String

    Tidak

    Menentukan perilaku caching objek.

    eq, eq-ci, starts-with, starts-with-ci, in, in-ci, not-in, not-in-ci

Mode pencocokan kondisi

Mode pencocokan kondisi

Deskripsi

content-length-range

Menentukan ukuran file minimum dan maksimum yang diizinkan untuk unggahan. Misalnya, untuk mengizinkan ukuran file dari 1 hingga 10 byte, tulis ["content-length-range", 1, 10].

eq

Menjalankan pencocokan eksak. Nilai bidang formulir harus sesuai persis dengan nilai yang dideklarasikan dalam kondisi. Misalnya, untuk mewajibkan nilai bidang formulir key menjadi "a", tulis ["eq", "$key", "a"].

starts-with

Menjalankan pencocokan awalan. Nilai bidang formulir harus diawali dengan awalan yang ditentukan. Misalnya, untuk mewajibkan nilai key diawali dengan "user/user1", tulis ["starts-with", "$key", "user/user1"].

in

Memeriksa apakah nilai tersebut termasuk dalam daftar string. Misalnya, untuk mengizinkan beberapa format gambar, gunakan ["in", "$content-type", ["image/jpg", "image/png"]].

not-in

Menentukan nilai-nilai yang harus dikecualikan dalam suatu kondisi sebagai daftar string. Misalnya, saat Anda mengunggah objek menggunakan API PostObject, Anda harus menentukan perilaku cache untuk objek tersebut. Jika nilai no-cache tidak didukung, Anda dapat menggunakan semantik not-in untuk menentukan kondisi sebagai ["not-in", "$cache-control", ["no-cache"]].

eq-ci

Menjalankan pencocokan eksak tanpa membedakan huruf besar/kecil. Nilai bidang formulir harus sesuai dengan nilai yang dideklarasikan dalam kondisi. Misalnya, untuk ["eq-ci", "$key", "AbC"], nama objek seperti "abc", "ABC", dan "aBc" semuanya cocok.

starts-with-ci

Menjalankan pencocokan awalan tanpa membedakan huruf besar/kecil. Nilai bidang formulir harus diawali dengan awalan yang ditentukan. Misalnya, untuk ["starts-with-ci", "$key", "User/"], nilai yang diawali dengan "user/", "USER/", atau "User/" semuanya cocok.

in-ci

Menjalankan pemeriksaan tanpa membedakan huruf besar/kecil untuk melihat apakah nilai tersebut termasuk dalam daftar string. Misalnya, untuk ["in-ci", "$content-type", ["IMAGE/JPG", "image/PNG"]], nilai seperti "image/jpg" dan "IMAGE/PNG" cocok.

not-in-ci

Menjalankan pemeriksaan tanpa membedakan huruf besar/kecil untuk melihat apakah nilai tersebut tidak termasuk dalam daftar string. Misalnya, untuk ["not-in-ci", "$cache-control", ["No-Cache"]], nilai seperti "no-cache", "NO-CACHE", dan "No-Cache" semuanya dikecualikan.

Karakter escape kebijakan

Dalam kebijakan POST, tanda dolar ($) merepresentasikan variabel. Untuk merepresentasikan tanda dolar literal, gunakan karakter escape \$. Tabel berikut menjelaskan karakter yang harus di-escape dalam JSON kebijakan.

Karakter escape

Deskripsi

\/

Garis miring maju

\\

Garis miring terbalik

\”

Tanda kutip ganda

\$

Tanda dolar

\b

Spasi

\f

Form feed

\n

Line break

\r

Carriage return

\t

Tab horizontal

\uxxxx

Karakter Unicode

Proses perhitungan tanda tangan

  1. Buat kebijakan yang diencode UTF-8.

  2. Buat string yang akan ditandatangani.

    Encode kebijakan dalam Base64. String hasilnya adalah string yang akan ditandatangani (StringToSign).

  3. Hitung tanda tangan.

    Tandatangani string yang akan ditandatangani menggunakan AccessKey secret. Metode penandatanganannya adalah Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).

image

Contoh lengkap perhitungan tanda tangan POST

Contoh Java berikut menunjukkan proses lengkap perhitungan tanda tangan POST untuk kebijakan tertentu.

import org.apache.commons.codec.binary.Base64;

public class Demo {
    public static void main(String[] args) {
        // Sebelum menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_SECRET telah disetel.
        String accessKeySecret =  System.getenv().get("OSS_ACCESS_KEY_SECRET");

        // Langkah 1: Buat kebijakan.
        String policy = "{\n" +
                "  \"expiration\": \"2023-12-03T13:00:00.000Z\",\n" +
                "  \"conditions\": [\n" +
                "    {\"bucket\": \"examplebucket\"},\n" +
                "    [\"content-length-range\", 1, 10],\n" +
                "    [\"eq\", \"$success_action_status\", \"201\"],\n" +
                "    [\"starts-with\", \"$key\", \"user/eric/\"],\n" +
                "    [\"in\", \"$content-type\", [\"image/jpg\", \"image/png\"]],\n" +
                "    [\"not-in\", \"$cache-control\", [\"no-cache\"]]\n" +
                "  ]\n" +
                "}";

        // Langkah 2: Buat string yang akan ditandatangani (StringToSign).
        String stringToSign = new String(Base64.encodeBase64(policy.getBytes()));

        // Langkah 3: Hitung tanda tangan.
        String signature = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, stringToSign);
        System.out.println("signature:" + signature);
    }
}

Hasil berikut dikembalikan:

signature:hR2cJnoG9uzrZLDAmrfOtUjtkSM=