使用Python 计算KS3 签名 (金山云对象存储签名)

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()
原文地址:https://www.cnblogs.com/zhangmingda/p/14127215.html