使用boto3在dynamodb put_item中使用Unicode解码错误

时间:2017-05-30 19:04:41

标签: python amazon-dynamodb

我正在尝试将API密码等存储在一个使用AES加密的dynamodb表中,并且我在存储它时遇到了问题。我有一个关于我正在写的数据的词典。

for key in endpoint:
        if 'password' in key or 'security' in key or 'secret' in key:
            #encrypt the value
            obj = AES.new(
                landlord_registry['default_crypt_salt'],
                AES.MODE_CFB,
                landlord_registry['default_crypt_iv'])
            endpoint[key] = {'B' : obj.encrypt(endpoint[key])}
        else:
            endpoint[key] = {'S' : endpoint[key]}

结果dict看起来像这样:

{'mvp_version': {'S': '0.3'}, 'endpoint_details': [{u'time_interval': {'S': u'30'}, u'username': {'S': u'blahblah@blahblah.org'}, u'primary_key': {'S': u'Id'}, u'security_token': {'B': '&\xd9\t\x7b\x9...'}, u'service_name': {'S': u'blahblah'}, u'enabled': {'S': u'1'}, u'endpoint_id': {'S': u'SFORG0'}, u'password': {'B': 'K9\x958,\x31.... '}}, {u'username': {'S': u'usernamelala'}, u'primary_key': {'S': u'ID__'}, u'database': {'S': u'z8_dev1'}, u'service_name': {'S': u'sdasda'}, u'enabled': {'S': u'1'}, u'host_name': {'S': u'lalala.rds.amazonaws.com'}, u'endpoint_id': {'S': u'MYSQL1'}, u'password': {'B': 'E##\xe2n....'}}]}

错误是:Dynamo Insert Error :(,UnicodeDecodeError('utf8',...,1,2,'无效的连续字节')

但据我所知,由于我使用了''B':'编码文本'},它应该尝试将其存储为字节而不是unicode文本。

1 个答案:

答案 0 :(得分:0)

我需要在Python 2中使用二进制(文本)包装器,以便将二进制文本存储在dynamodb中。这一行:

endpoint[key] = {'B' : obj.encrypt(endpoint[key])}

应该是这样的:

endpoint[key] = {'B' : Binary(obj.encrypt(endpoint[key]))}