我需要对AES
进行AES
加密和redshift
解密。
我的加密和解密代码在我的本地系统上成功运行。但是,在redshift
上创建相同代码的库之后,出现以下错误:
Amazon无效操作:ImportError:未命名模块 加密密码请查看svl_udf_log以获取更多信息。
请帮助我如何在redshift
数据库上添加密码库。
我已按照以下步骤操作:
步骤1: 创建文件AESEncrypt.py,代码如下。
class AESEncrypt(object):
iv = '1111111111111111'
def __init__(self):
self.bs = AES.block_size
def encrypt(self, raw, key):
raw = self._pad(raw)
cipher = AES.new(key, AES.MODE_CBC, self.iv)
return base64.b64encode(cipher.encrypt(raw))
def decrypt(self, enc, key):
enc = base64.b64decode(enc)
cipher = AES.new(key, AES.MODE_CBC, self.iv)
return self._unpad(cipher.decrypt(enc)).decode('utf-8')
def _pad(self, s):
return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
@staticmethod
def _unpad(s):
return s[:-ord(s[len(s)-1:])]
'''
# Testing Code
key = 'my_test_key_0001'
data = 'my_test_data'
aes = AESEngine()
encString = aes.encrypt(data, key)
print encString
decString = aes.decrypt(encString, key)
print decString
'''
使用此代码进行加密解密。
步骤2: 使用代码创建了一个zip文件(my_functions.zip),并在redshift上创建了一个库
create library all_functions
language plpythonu
from 's3://my-bucket/my_functions.zip'
credentials 'aws_access_key_id=my_aws_access_key_id ;aws_secret_access_key=my_aws_secret_access_key'
region as 'my_region';
第3步:
CREATE OR REPLACE FUNCTION AES_ENCRYPT (originalVal varchar, key varchar)
RETURNS VARCHAR
STABLE
AS $$
from my_functions.crypto.AESEncrypt import AESEncrypt
return AESEncrypt().encrypt(originalVal,key)
$$ LANGUAGE plpythonu
;
第4步:
select AES_ENCRYPT('my_test_data','my_test_key_0001');
Amazon无效操作:ImportError:未命名模块 加密密码请查看svl_udf_log以获取更多信息 详细信息:--------------------------------------------------------------错误: ImportError:没有名为Crypto.Cipher的模块。请看svl_udf_log 有关更多信息,代码:10000上下文:UDF查询:
0位置:udf_client.cpp:369进程:padbmaster [pid = 16635] -----------------------------------------------; [SQL State = XX000,DB Errorcode = 500310] 1条语句失败。