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.
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
|
|
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
|
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.
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.000Zberarti 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
Proses perhitungan tanda tangan
-
Buat kebijakan yang diencode UTF-8.
-
Buat string yang akan ditandatangani.
Encode kebijakan dalam Base64. String hasilnya adalah string yang akan ditandatangani (StringToSign).
-
Hitung tanda tangan.
Tandatangani string yang akan ditandatangani menggunakan AccessKey secret. Metode penandatanganannya adalah
Signature = base64(hmac-sha1(AccessKeySecret,base64(policy))).
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=