2016-06-15 22 views
1

私は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文字の長いダイジェストを作成する方法を知らない。

+0

使用するには、次のように例がありますか? Boto3あなたのためにそれを計算する必要があります。 – garnaat

+0

私がそれを提供しない場合、私は400 Bad Requestエラーを受け取ります。 – Darwesh

答えて

0

行うための正しい方法はos.urandom

import os 
secret_key = os.urandom(32) # The key needs to be 32 character long. 

を使用することであり、一つはboto3はあなたのためにそれを求めるようSSECustomerKeyMD5を提供する必要はありません。

また、SSE-Cはkey.putですぐには動作しませんが、今のところ私は何の理由かわかりません。 1つはこのようにしなければならない。

s3 = boto3.client('s3') 
s3.put_object(**kwargs) 
0

SSEはObjectでも動作します。

import boto3 
from botocore.config import Config 

s3 = boto3.resource('s3', 
        region_name="us-east-1", 
        aws_access_key_id="key id", 
        aws_secret_access_key="access key", 
        config=Config(signature_version='s3v4')) 
s3.Object("bucket", "filename").put(Body="text", 
            SSEKMSKeyId="some id", 
            ServerSideEncryption='aws:kms') 

が、それを読んで、あなたが `` SSECustomerKeyMD5``のPARAMを提供しない場合はどうなり

s3.Object("bucket", "filename").get()['Body'].read() 
関連する問題