• 使用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()
  • 相关阅读:
    commons-fileupload源码学习心得
    commons-io源码阅读心得
    java反射机制
    构建简单的socket连接池
    maven主仓库中找不到restlet的解决办法
    修改eclipse中web项目的server部署路径
    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project '项目名'
    JVM中的Stack和Heap
    JVM工作原理和特点
    spring mvc 3.1的自动注入参数遇到的问题
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14127215.html
Copyright © 2020-2023  润新知