开发者社区> 问答> 正文

DeleteMultipleObjects中ContentMD5字段内容怎么计算


正在用OSS的api开发一个sdk,现在做到Delete Multiple Objects这里了。

第一次开发sdk,好多问题。之前遇到的问题我都自己解决了,现在Content-MD5这个字段为什么不和签名那里的算法一样呢?这个算法怎么搞。

2)  生成Content-MD5字段内容方法:首先将Delete Multiple Object请求内
容经过MD5加密后得到一个128位字节数组;再将该字节数组用base64算
法编码;最后得到的字符串即是Content-MD5字段内容。

签名那里都是直接调用md5计算,然后再进行base64编码,这里的话该怎么弄呢?

求教!!!!



已解决,解决方案:签名哪里是md5加密后的32位字符串,而这里是md5加密后的二进制数组,是对这个二进制进行base64编码而非对32位字符串编码。


展开
收起
一折 2013-08-12 15:54:37 22773 0
10 条回答
写回答
取消 提交回答
  •     md5_str = base64.urlsafe_b64encode(md5_str)

    不知道为什么要用urlsafe_b64encode?
    这个表示做完base64编码后,还会
    将结果中的加号”+”替换成中划线“-“;
    将结果中的斜杠”/”替换成下划线”_”;

    这样可能会造成content-md5验证不通过。
    md5_str = base64.b64encode(md5_str)  这样就可以了。

    -------------------------

    另外说下,Python出了新的SDK
    https://github.com/aliyun/aliyun-oss-python-sdk
    支持了python3,可以试用下

    2015-12-11 11:14:11
    赞同 展开评论 打赏
  • 回 17楼阿森纳2的帖子
    我是用Python的实现
    2015-12-11 01:21:11
    赞同 展开评论 打赏
  • 我来说下我的理解。

    首先来看下标准中对HTTP Header中Content-MD5的定义(摘自 RFC1864 ):

    The output of the MD5 algorithm is a 128 bit digest.  When viewed in    network byte order (big-endian order), this yields a sequence of 16 octets of binary data.  These 16 octets are then encoded according to  the base64 algorithm in order to obtain the value that is placed in  the Content-MD5 field.  Thus, if the application of the MD5 algorithm  over the raw data of a MIME entity results in a digest having the  (unlikely) value of "Check Integrity!", then that MIME entity's  header could contain the field.

    标准中定义的算法简单点说就是:先计算md5加密的二进制数组(128 bits),再对这个二进制进行base64编码(而不是对32位字符串编码)。

    所以,Delete Multiple Objects请求填的Content-MD5必须按照上面的算法来获得。

    至于计算签名的那个地方,它不会验证你的Content-MD5是否合法,它只认为这是一个字符串。现在你不填,甚至填个错的都是可以通过的。

    建议大家写代码的时候,严格按照标准来写。以后OSS如果开始验证上传数据的Content-MD5,那么你填个错误的Content-MD5,就会出错。

    -------------------------

    再多说一句。

    通过普通PUT请求上传的Object,OSS返回的ETAG定义是内容的MD5值,也就是32个十六进制数的字符串。和Content-MD5相比是没有经过base64编码的。

    -------------------------

    回楼上,我说的“Content-MD5是否合法”,是指不会验证HTTP头里的content-md5字段和上传数据的md5值是否一样。  在验证签名头的时候,是要判断提交的Content-MD5和签名中的Content-MD5是否一致。  

    举个例子:你可以将HTTP头中的Content-MD5和签名中的都设置成“xxxxx”,是可以通过签名验证的;但你上传内容的MD5值,肯定不是“xxxxx”。

    2013-08-14 10:26:23
    赞同 展开评论 打赏
  • 优秀文章-欢迎进行技术分享,感谢你的支持!
    2013-08-13 21:54:57
    赞同 展开评论 打赏
  • 回3楼梦幻星辰的帖子
    和签名那里一样吗?

    官方文档里说这里的Content-MD5是请求内
    容经过MD5加密后得到一个 128位字节数组;再将该 字节数组用base64算
    法编码;

    而签名那里是直接对MD5加密后的32位字符串进行base64编码。

    -------------------------

    回7楼lcwangchao的帖子
    是用hmac_sha1加密的

    -------------------------

    回9楼梦幻星辰的帖子
    这里是先请求到xml文件的md5值,在经过base54位算法得到字段内容。

    我就是这么弄的,但是还是不行。下面这个。

    <?xml version="1.0" encoding="UTF-8"?>
    <Error>
      <Code>InvalidDigest</Code>
      <Message>The Content-MD5 you specified was invalid.</Message>
      <Content-MD5>BIgg bZ9FyZ9PJAkuVk1 w==</Content-MD5>
      <RequestId>5208E2DDB6ADCDAF05A5B1C3</RequestId>
      <HostId>yb1225.oss.aliyuncs.com</HostId>
    </Error>
    这个是请求的内容
    <?xml version="1.0" encoding="UTF-8"?>
    <Delete>
      <Quiet>true</Quiet>
      <Object>
        <Key>test1.txt</Key>
      </Object>
      <Object>
        <Key>test2.txt</Key>
      </Object>
      <Object>
        <Key>test3.txt</Key>
      </Object>
      <Object>
        <Key>test4.txt</Key>
      </Object>
    </Delete>

    麻烦能不能用正确的算法算下,我好和正确的值比较。

    -------------------------

    回13楼sanbo的帖子
    至于计算签名的那个地方,它不会验证你的Content-MD5是否合法,它只认为这是一个字符串。现在你不填,甚至填个错的都是可以通过的。

    你这句话就不对了吧?他虽然不会验证这个Content-MD5是否合法,但是他会验证协议头中提交的Content-MD5和签名中的Content-MD5是否一致,不一致的话签名都会失败,何谈通过?
    2013-08-12 16:32:16
    赞同 展开评论 打赏
  • ReDeleteMultipleObjects中ContentMD5字段内容怎么计算
    Content-MD5和请求签名就不是一回事吧:

    签名算法是用来验证用户的合法性的,Content-MD5是为了保证请求不被篡改。

    我觉得首先通过 base64(md5(content))算出Content-MD5的header来,然后再通过之前的方法算出签名放在Auth头里面

    -------------------------

    回6楼一折的帖子
    签名使用的sha1加密的吧。。
    2013-08-12 16:30:37
    赞同 展开评论 打赏
  • ReDeleteMultipleObjects中ContentMD5字段内容怎么计算
    可以参考一下官方SDK里面的实现方法
    2013-08-12 16:19:31
    赞同 展开评论 打赏
  • Access Key ID & Access Key Secret (API密钥)
    用户注册OSS时,系统会给用户分配一对Access Key ID & Access Key Secret,称为ID对,用于标识用户,为访问OSS做签名验证。
    现在Content-MD5这个字段和签名那里的算法一样 ,以官方oss开发文档参考准

    由于OSS有着非常优秀的网络带宽质量,很多朋友希望基于OSS开发图片、音乐、视频等网站和应用。但如何有效地防盗链是个让人头疼的问题。这里介绍一个简单且安全的方法:通过签名URL防盗链。
    首先,确认自己的bucket权限是private,即这个bucket的所有请求必须在签名认证通过后才被认为是合法的。然后根据操作类型、要访问的bucket、要访问的object以及超时时间,动态地生成一个经过签名的URL。通过这个签名URL,你授权的用户就可以在该签名URL过期时间前执行相应的操作。
    签名的python代码如下:

      
    url = my_store.sign_url (method, bucket_name, object_name,timeout = 60)


    其中method可以是PUT,GET,HEAD,DELETE中的任意一种;最后一个参数“timeout”是超时的时间,单位是秒。一个通过上面python方法,计算得到的签名URL为:


      
    http://storage.aliyun.com/sharedata/lingyun.jpg?OSSAccessKeyId=y6h7nbcothehvcp7jlnwmrw9&Expires=1335084740&Signature=LZeqnHSo5WkDNWKffKDgQBXR6fY=


    通过这种动态计算签名URL的方法,可以有效地保护放在OSS上的数据,防止被其他人盗链。
      技术来源: http://dev.aliyun.com/read.php?tid=16

    -------------------------

    经过测试和交谈得到的最新答案
    head中的签名是CONTENT-MD5表示请求内容数据的MD5值

    Delete Multiple Objects
    MD5字段内容方法:首先将Delete Multiple Object请求内容经过MD5加密后得到一个128位字节数组;再将该字节数组用base64算法编码;最后得到的字符串即是Content-MD5字段内容。
    这里是先请求到xml文件的md5值,在经过base54位算法得到字段内容。

    示例:python代码信息:
    def batch_delete_object(self, bucket, object_list_xml, headers=None, params=None):
    '''
    Delete the objects in object_list_xml
    :type bucket: string
    :param:

    :type object_list_xml: string
    :param:

    :type headers: dict
    :param: HTTP header

    :type params: dict
    :param: the parameters that put in the url address as query string

    Returns:
    HTTP Response
    '''
    if not headers:
    headers = {}
    if not params:
    params = {}
    method = 'POST'
    object = ''
    body = object_list_xml
    headers['Content-Length'] = str(len(body))
    params['delete'] = ''
    base64md5 = base64.encodestring(md5.new(body).digest())
    if base64md5[-1] == '\n':
    base64md5 = base64md5[0:-1]
    headers['Content-MD5'] = base64md5
    return self.http_request(method, bucket, object, headers, body, params)

    相关信息请您参考api和sdk文件。
    谢谢。

    -------------------------

    回 10楼(一折) 的帖子
    实在不懂  请发工单至阿里云。谢谢
    2013-08-12 16:15:31
    赞同 展开评论 打赏
  • 等楼下,
    2013-08-12 16:06:11
    赞同 展开评论 打赏
  • 不懂
    2013-08-12 16:05:36
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多