我想要加密我的Pandas (或py/spark)数据帧中一列中的值,例如,获取以下数据帧中的列mobno
,对其进行加密并将结果放入encrypted_value
列中:
我要使用AWS KMS加密密钥。我的问题是:实现这一目标最优雅的方式是什么?
我正在考虑使用UDF,它将调用boto3的KMS客户端。类似于:
@udf
def encrypt(plaintext):
response = kms_client.encrypt(
KeyId=aws_kms_key_id,
Plaintext=plaintext
)
ciphertext = response['CiphertextBlob']
return ciphertext
然后在整个列上应用该udf。
但我不太相信这是正确的方式。这源于这样一个事实:我是一个加密新手--首先,我甚至不知道这个kms_client_encrypt
函数是用于加密值(来自列)还是用于操作密钥。也许更好的方法是获得密钥,然后使用一些python加密库(比如hashlib
)。
我希望对加密过程有一些澄清,并建议列加密的最佳方法是什么。
发布于 2020-09-22 20:29:41
为了避免在UDF中多次调用KMS服务,请改用AWS Secrets Manager来检索加密密钥,并使用pycrypto
来加密列。以下是工作原理:
from pyspark.sql.functions import udf, col
from Crypto.Cipher import AES
region_name = "eu-west-1"
session = boto3.session.Session()
client = session.client(service_name='secretsmanager', region_name=region_name)
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
secret_key = json.loads(get_secret_value_response['SecretString'])
clear_text_column = 'mobo'
def encrypt(key, text):
obj = AES.new(key, AES.MODE_CFB, 'This is an IV456')
return obj.encrypt(text)
def udf_encrypt(key):
return udf(lambda text: encrypt(key, text))
df.withColumn("encrypted", udf_encrypt(secret_key)(col(clear_text_column))).show()
或者,使用@Vektor88建议的更高效的Pandas UDF (PySpark 3语法):
from functools import partial
encrypt_with_key = partial(encrypt, secret_key)
@pandas_udf(BinaryType())
def pandas_udf_encrypt(clear_strings: pd.Series) -> pd.Series:
return clear_strings.apply(encrypt_with_key)
df.withColumn('encrypted', pandas_udf_encrypt(clear_text_column)).show()
https://stackoverflow.com/questions/56428549
复制相似问题