Les objets stockés dans Object Storage Service (OSS) possèdent des valeurs ETag permettant d'identifier les modifications apportées aux données sur le serveur. Toutefois, ces valeurs ETag ne correspondent pas nécessairement aux hachages MD5 des objets. Nous vous recommandons de ne pas utiliser les valeurs ETag pour vérifiez la cohérence des données.
Pour contrôler si un objet téléchargé vers OSS est identique au fichier local, vous pouvez inclure l'en-tête Content-MD5 dans votre requête de téléchargement. À la réception de l'objet, OSS compare le hachage MD5 calculé avec la valeur fournie dans l'en-tête Content-MD5. Le téléchargement n'est accepté que si les deux valeurs correspondent, garantissant ainsi la cohérence des données.
Cette section utilise le contenu « 0123456789 » comme exemple pour illustrer les méthodes correctes et incorrectes de calcul de la valeur Content-MD5.
-
Calcul correct
Calculez d'abord le hachage MD5, qui correspond à un tableau binaire de 128 bits.
Encodez ce tableau binaire en Base64. N'encodez surtout pas la chaîne hexadécimale de 32 caractères.
L'exemple suivant est écrit en Python :
>>> import base64,hashlib >>> hash = hashlib.md5() >>> hash.update("0123456789") # In Python 3, change this to hash.update(b"0123456789"). >>> base64.b64encode(hash.digest()) 'eB5e********************'La méthode hash.digest() renvoie le tableau binaire de 128 bits.
>>> hash.digest() 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7' -
Exemple de calcul incorrect
RemarqueUne erreur fréquente consiste à encoder directement en Base64 la chaîne hexadécimale de 32 caractères.
# The hash.hexdigest() method calculates the visible 32-character hexadecimal string. >>> hash.hexdigest() '781e****************************' # The result of Base64-encoding the incorrect MD5 hash. >>> base64.b64encode(hash.hexdigest()) 'Nzgx****************************************'
Certains paramètres d'en-tête, tels que Content-MD5, doivent être inclus dans le calcul de la signature. L'en-tête et la signature doivent correspondre. Dans le cas contraire, une erreur SignatureDoesNotMatch est renvoyée. Pour plus d'informations sur les en-têtes à signer, consultez Signature V1.