DeleteMultipleObjects中ContentMD5字段内容怎么计算
我来说下我的理解。
首先来看下标准中对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”。
赞0
踩0