1. 通过 HTTP 请求 Header 发送的签名
算法
Signature = base64(hmac - sha1(VERB + " " + CONTENT - MD5 + " " + CONTENT - TYPE + " " + DATE + " " [+ CanonicalizedKssHeaders + " "] + CanonicalizedResource, SecreteKey))
Content-MD5, Content-Type, CanonicalizedKssHeaders可为空, 若为空,则使用空字符串("")替代, HTTP-Verb、Date和CanonicalizedResource不能为空
- HTTP-Verb 表示请求的方法,如:GETPUTPOSTDELETE等
- Content-MD5 表示请求内容数据的MD5值, 使用Base64编码。当请求的header中包含Content-MD5时,需要在StringToSign中包含,否则用("")替代。 注意:Content-MD5的算法为先对数据做MD5摘要,再将MD5摘要做Base64编码。中间不需要做HEX编码,由于部分语言或工具包的MD5是默认做HEX编码的,所以当MD5算出来的结果为HEX编码的,首先需要对算出来的结果做HEX解码,然后再做Base64编码。详解RFC2616
- Content-Type 表示请求内容的类型,取HTTP header中的Content-Type
-
Date 表示此次操作的时间,且必须为 HTTP1.1 中支持的 GMT 格式。取HTTP Header中的Date,如果该时间与KS3服务端时间相差15分钟以外,将导致KS3返回403。比如:Wed, 17 Feb 2012 15:31:56 GMT
注意: 有的客户端不支持发送Date请求头。这种情况下,计算签名时需要保持Date字段的同时,在CanonicalizedKssHeaders中加入x-kss-date,格式与Date一致。发送请求时,需要添加x-kss-date请求头。详见示例。
- CanonicalizedKssHeaders 表示HTTP请求中的以x-kss开头的Header组合,详见CanonicalizedKssHeaders计算方法。
- CanonicalizedResource 表示用户访问的资源,详见CanonicalizedResource的计算方法。
示例:
计算Content-MD5
import hashlib import base64 xml_body = '<Replication xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><prefix>opt</prefix><targetBucket>ksc-asts-qingdao</targetBucket><DeleteMarkerStatus>Disabled</DeleteMarkerStatus></Replication>' body_md5_digest = hashlib.md5(xml_body.encode('utf-8')).digest() base64_md5_digest = base64.encodebytes(body_md5_digest).decode() print(base64_md5_digest)
# 输出:XebD0V4hpzgaRJLdQjGnSA==
计算签名
import hashlib import hmac import base64 verb = 'PUT' md5 = 'XebD0V4hpzgaRJLdQjGnSA==' content_type = 'text/xml' date_ = 'Sat, 12 Dec 2020 03:11:30 GMT' resource = '/zhangmingda/?crr' sk = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' string_to_sign = verb + ' ' + md5 + ' ' + content_type + ' ' + date_ + ' ' + resource signature = base64.encodebytes(hmac.new(sk.encode(), string_to_sign.encode(), hashlib.sha1).digest()).strip().decode('utf-8') print(signature)
2. 通过URL QueryString发送的签名
算法
Signature = base64(hmac - sha1(VERB + " "
+ "" + " "
+ "" + " "
+ Expires + " "
+ CanonicalizedResource, SecreteKey))
示例:
import hashlib import hmac import base64 string_to_sgin2 = 'GET' + ' ' + ' ' + ' ' + '1607782768' + ' ' + '/' sginature = base64.encodebytes(hmac.new(sk.encode(),string_to_sgin2.encode(),hashlib.sha1).digest()).strip().decode()