2016-08-10 3 views
0

J'essaie de crypter un fichier pdf dans mon application avec une clé que j'ai créée dans AWS IAM et de télécharger le fichier crypté vers S3. J'utilise boto3 pour y parvenir. Je pourrais télécharger le fichier sur S3 sans cryptage cependant. Voici ma fonction qui fait le cryptage:botocore.exceptions.ClientError: Cryptage KMS côté client

def write(self): 
    print 'Write to S3' 
    client = boto3.client('kms') 

    s3 = boto3.client('s3') 
    input_file = open('265987747.pdf', 'rb') 
    data = input_file.read() 
    input_file.close() 
    print type(data) 
    response = client.encrypt(
     KeyId='alias/efax', 
     Plaintext=data, 
     EncryptionContext={ 
      'string': 'string' 
     } 
    ) 
    #Upload file to S3 
    #s3.upload_file("265987747.pdf", "bucket_efax", "265987747.pdf") 

Je reçois cette erreur suivante:

botocore.exceptions.ClientError: Une erreur est survenue (ValidationException) lors de l'appel de l'opération Chiffrer: 1 erreur de validation détectée: Valeur à 'texte en clair' n'a pas réussi à satisfaire la contrainte: membre doit avoir une longueur inférieure ou égale à 4096

Je ne suis pas sûr si j'utilise la méthode correcte pour crypter un fichier dans KMS.

Répondre

0

Vous essayez probablement de chiffrer des données de plus de 4 Ko. Comme la documentation l'indique, vos données ne peuvent pas dépasser 4 Ko (votre erreur le signale également).

You can encrypt up to 4 KB of arbitrary data such as an RSA key, a database password, or other sensitive customer information.

If you are moving encrypted data from one region to another, you can use this API to encrypt in the new region the plaintext data key that was used to encrypt the data in the original region. This provides you with an encrypted copy of the data key that can be decrypted in the new region and used there to decrypt the encrypted data.

Voir la docs pour plus d'infos

Pour autant que je me souviens Boto ne prend pas en charge le cryptage côté client des fichiers encore.

Vous devrez les crypter vous-même et les envoyer à s3, j'ai implémenté un petit code pour le cryptage côté client here pour django filefield. J'espère que ça aide