我正在尝试将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文本。
答案 0 :(得分:0)
我需要在Python 2中使用二进制(文本)包装器,以便将二进制文本存储在dynamodb中。这一行:
endpoint[key] = {'B' : obj.encrypt(endpoint[key])}
应该是这样的:
endpoint[key] = {'B' : Binary(obj.encrypt(endpoint[key]))}