すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:ETag値をOSS MD5ハッシュとして使用してデータの一貫性を確認できますか?

最終更新日:Dec 14, 2023

Object Storage Service (OSS) のオブジェクトには、サーバー上のデータに変更が加えられたかどうかを識別するために使用されるETag値があります。 しかしながら、これらのETag値は、オブジェクトのMD5ハッシュと必ずしも等しくない。 データの整合性を確認するためにETag値を使用しないことを推奨します。

OSSにアップロードされたオブジェクトがローカルファイルと一致しているかどうかを確認するには、アップロード要求にContent-MD5ヘッダー値を含めることができます。 OSSがオブジェクトを受信すると、OSSはMD5ハッシュをContent-MD5ヘッダー値と比較します。 オブジェクトは、MD5ハッシュがContent-MD5ヘッダー値と一致する場合にのみアップロードできます。 このようにして、データの一貫性が保証される。

次の例では、文字列 "123456789" を使用して、リクエストコンテンツのContent-MD5値を計算する方法を示します。

  • 正しい計算

    1. 文字列のMD5ハッシュを計算します。これは128ビットのバイナリ配列です。

    2. 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が返されます。 署名情報を伝達するヘッダーの詳細については、「承認ヘッダーに署名を含める」をご参照ください。