私はS3にメディアをアップロードするために私のdjangoアプリケーションでboto3を使用しています。しかし、私はサーバー上でファイルを暗号化するのに問題があります。「お客様側の暗号化キーを使用したサーバー側の暗号化」Pythonでboto3ファイルの暗号化のためのSSECustomerKeyを作成する正しい方法は何ですか?
私はboto3のobject.put()APIを使用してファイルをアップロードし、暗号化キーを指定しています。しかし、私は次のエラーが発生しています。
"キーの計算されたMD5ハッシュは、 のハッシュと一致しませんでした。
サーバー側で一致するキーのmd5を作成する方法はわかりません。ここに私のコードです。
password = "32characterslongpassphraseneeded".encode('utf-8')
encryption_key = hashlib.md5(password).hexdigest()
encryption_key_md5 = hashlib.md5(encryption_key.encode('utf-8')).hexdigest()
import boto3
s3 = boto3.resource('s3')
key = s3.Object(bucket_name, key_name)
kwargs = {
'SSECustomerAlgorithm': 'AES256',
'SSECustomerKey': encryption_key,
'SSECustomerKeyMD5': encryption_key_md5,
'ContentType': file_obj.content_type,
'Body': file_obj,
}
key.put(**kwargs)
私は同じs3 apiをPHPクライアントで利用していますが、問題なく動作します。
$name="somename"
$customerKey = md5($name);
$s3->putObject([
'Bucket' => S3_BUCKET,
'Key' => "scope/{$name}",
'Body' => fopen($tmp_file_path, 'rb'),
'ACL' => S3_ACL,
'SSECustomerAlgorithm' => 'AES256',
'SSECustomerKey' => $customerKey,
'SSECustomerKeyMD5' => md5($customerKey ,true),
]);
私はここを参照してください唯一の違いは、長いダイジェスト通常の32文字と比較して、PHPのMD5メソッドは、trueを返し、16文字の場合、長いダイジェスト、第二引数を取ることができるということです。今、私はhashlib.md5を使って16文字の長いダイジェストを作成する方法を知らない。
使用するには、次のように例がありますか? Boto3あなたのためにそれを計算する必要があります。 – garnaat
私がそれを提供しない場合、私は400 Bad Requestエラーを受け取ります。 – Darwesh