POST請求簽名(V2版本)
更新時間 2025-06-13 17:05:28
最近更新時間: 2025-06-13 17:05:28
分享文章
此文檔介紹通過POST請求上傳對象所需的V2版本簽名方法。
POST V2簽名說明
POST簽名是指使用POST方式上傳文件時,要求每個請求都必須附帶一個簽名(Signature)。POST V2簽名是通過訪問密鑰(Secret Access Key)對一系列請求參數(上傳策略policy等)進行加密計算得到的。當請求發送時,會驗證簽名的合法性,只有簽名驗證成功的請求才會被接受,否則請求將被拒絕。
POST V2簽名表單獨有參數
POST V2簽名除了POST上傳對象中說明的公共表單元素外,會有一些獨有的表單元素:
| 參數 | 參數類型 | 說明 |
|---|---|---|
| AWSAccessKeyId | String | Bucket擁有者的Access Key ID,當Bucket為非public-read-write或者提供了Policy(或Signature)表單域時,必須提供AWSAccessKeyId表單域 |
| Signature | String | 根據AccessKey Secret和Policy計算的簽名信息,驗證該簽名信息從而驗證該Post請求的合法性。注意: 當Bucket為非public-read-write或者提供了AWSAccessKeyId(或Policy)表單域時,必須提供Signature表單域,同時表單域的值對大小寫敏感,但是表單域對大小寫不敏感 |
Policy說明
Policy表單域是一種安全策略,若請求不包含Policy,則只能訪問public-read-write的Bucket, 當Bucket為非public-read-write或者提供了AccessKeyId(或Signature)表單域時,必須提供Policy表單域 。 Policy由JSON格式來定義,可以通過多項參數來限制上傳的相關操作,比如允許上傳的Bucket、Key前綴等。
其中,policy中有兩個字段是必須的:
- expiration:指定policy的過期時間(ISO8601 GMT格式)。例如指定為2024-12-16T13:00:00.000Z,表示必須在2024年12月16日13點之前發起POST請求。
- conditions:指定POST請求表單域的合法值。
conditions表
| 參數 | 參數類型 | 必選 | 說明 | 匹配方式 | 示例 |
|---|---|---|---|---|---|
| bucket | String | 否 | 存儲桶名稱。 | bucket | {"bucket": "examplebucket"} |
| key | String | 否 | 上傳對象的名稱。 | eq、starts-with | ["eq", "$key", "ExampleObject"] |
| content-length-range | String | 否 | 上傳對象時的最小以及最大允許的大小,單位是字節。 | content-length-range | ["content-length-range", 1, 10] |
| success_action_status | String | 否 | 上傳成功后的返回狀態碼。 | eq、starts-with | ["eq", "$success_action_status", "201"] |
| content-type | String | 否 | 限制對象的文件類型。 | eq、starts-with | ["eq", "$content-type", "image/jpg"] |
| cache-control | String | 否 | 緩存控制。 | eq、starts-with | ["eq", "$cache-control", "no-cache"] |
conditions匹配方式表
| 匹配方式 | 說明 |
|---|---|
| eq | 精確匹配。比如 ["eq", "$key", "ExampleObject"],則表單域中指定key的值必須為ExampleObject:{"key": "ExampleObject"}。 |
| starts-with | 前綴匹配。比如 ["starts-with", "$key", "aaa/bbb"],則表單域中指定key的值必須以aaa/bbb開始:{"key": "aaa/bbb/ccc"}。 |
示例
{
"expiration": "2024-12-16T13:00:00.000Z",
"conditions": [
{"bucket": "testbucket"},
["content-length-range", 1, 10],
["eq", "$success_action_status", "201"],
["starts-with", "$key", "aaa/bbb/"]
]
}
POST V2簽名生成規則
Signature形式
Base64(HmacSHA1(SecretAccessKey,Base64(PolicyJSON)))
簽名步驟
- 第一步:創建utf-8編碼的policy
- 第二步:構造簽名字符串,在POST V2簽名中,StringToSign是policy的Base64編碼字符串
- 第三步:計算簽名Signature,生成最終的簽名時需要使用SecretAccessKey對StringToSign進行簽名,該簽名的計算方式為
Base64(HmacSHA1(SecretAccessKey,StringToSign))
生成POST V2簽名參數代碼示例
這里提供Python示例代碼展示POST V2簽名的計算過程:
import base64
import hmac
import hashlib
import json
def calculate_signature(string_to_sign, secret_key):
secret_key_bytes = bytes(secret_key, 'utf-8')
string_to_sign_bytes = bytes(string_to_sign, 'utf-8')
signature = hmac.new(secret_key_bytes, string_to_sign_bytes, hashlib.sha1).digest()
return base64.b64encode(signature).decode('utf-8')
def main():
access_key = "訪問密鑰ID"
secret_key = "私有訪問密鑰"
bucket = "testbuck"
key = "testobj"
# 創建 policy
policy_json = {
"expiration": "2024-12-16T13:00:00.000Z",
"conditions": [
{"bucket": bucket},
["starts-with", "$key", key]
]
}
# 創建簽名字符串
string_to_sign = base64.b64encode(json.dumps(policy_json).encode('utf-8')).decode('utf-8')
# 計算簽名
signature = calculate_signature(string_to_sign, secret_key)
print("key:", key)
print("AWSAccessKeyId:", access_key)
print("policy:", string_to_sign)
print("signature:", signature)
if __name__ == '__main__':
main()
輸出的結果:
key: testobj
AWSAccessKeyId: 訪問密鑰ID
policy: eyJleHBpcmF0aW9uIjogIjIwMjQtMTItMTRUMTM6MDA6MDAuMDAwWiIsICJjb25kaXRpb25zIjogW3siYnVja2V0IjogInRlc3RidWNrIn0sIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJ0ZXN0b2JqIl1dfQ==
signature: X2g5gF2cW1wjejnF4DQoUXg1z2s=