Object Storage Service (OSS) のオブジェクトには、サーバー上のデータに変更が加えられたかどうかを識別するために使用されるETag値があります。 しかしながら、これらのETag値は、オブジェクトのMD5ハッシュと必ずしも等しくない。 データの整合性を確認するためにETag値を使用しないことを推奨します。
OSSにアップロードされたオブジェクトがローカルファイルと一致しているかどうかを確認するには、アップロード要求にContent-MD5ヘッダー値を含めることができます。 OSSがオブジェクトを受信すると、OSSはMD5ハッシュをContent-MD5ヘッダー値と比較します。 オブジェクトは、MD5ハッシュがContent-MD5ヘッダー値と一致する場合にのみアップロードできます。 このようにして、データの一貫性が保証される。
次の例では、文字列 "123456789" を使用して、リクエストコンテンツのContent-MD5値を計算する方法を示します。
正しい計算
文字列のMD5ハッシュを計算します。これは128ビットのバイナリ配列です。
Base64で (32ビット文字列の代わりに) バイナリ配列をエンコードします。
次のPythonコードは、Content-MD5値の計算方法の例を示しています。
>>> インポートbase64、hashlib >>> hash = hashlib.md5() >>> hash.update("0123456789") # Python 3を使用する場合は、この部分をhash.update(b "0123456789") に変更します。 >>> base64.b64encode(hash.digest()) 'eB5eJF1ptWaXm4bijSPyxw=='
hash.digest() を呼び出して、128ビットのバイナリ配列を計算します。
>>> hash.digest() 'x\x1e ^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
不正計算
説明一般的な誤った操作は、計算された32ビット文字列をBase64でエンコードしてContent-MD5値を取得することです。
# hash.hexdigest() を呼び出して、32ビットの平文文字列を取得します。 >>> hash.hexdigest() '781e5e245d69b566979b86e28d23f2c7' # 次のコードは、Base64で誤ったMD5ハッシュをエンコードした結果の例を示しています。>>> base64.b64encode(hash.hexdigest()) 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='
説明 Content-MD5などの一部のヘッダーのパラメーターを署名計算に追加する必要があります。 ヘッダーのパラメーターは、署名のパラメーターと一致している必要があります。 それ以外の場合、エラーメッセージSignatureDoesNotMatchが返されます。 署名情報を伝達するヘッダーの詳細については、「承認ヘッダーに署名を含める」をご参照ください。