在 Python/Airflow 中加密数据并在 BigQuery 中解密的方法
Method to encrypt data in Python/Airflow and decrypt in BigQuery
我需要一个管道
- 从 API
获取敏感数据
- de-identify/encrypt 基于特定条件的特定字段
- 上传数据 post 加密(换行符分隔 JSON 格式)到 BigQuery table
除了上述之外,我还需要能够 re-identify/decrypt BigQuery 中的数据(例如 UDF,AEAD functions)。
现在的问题是我无法弄清楚如何在 Python 中以一种可以在 BigQuery 中 re-identified/decrypted 的方式加密此数据。
到目前为止,我已经看到许多使用 Dataflow/DLP/Cloud KMS 或 Python 库(例如 Fernet)加密数据的管道示例。这些相同的示例还展示了管道如何解密数据。但是,它们不提供直接在 BQ 中解密数据的方法。
我还了解了如何使用 BQ AEAD 函数 encrypt/decrypt 数据。我还没有想出如何在 Python 中加密数据,以便可以在 BQ 中解密它。
我考虑过在 BQ 中而不是 Airflow/Python 中通过暂存 tables 进行加密过程,但是由于必须加密的嵌套字段的数量,这很复杂。
加密部分在 Python/Airflow 中更容易完成。 BigQuery 中的解密步骤很简单。
如何使用 Python 中可以在 BigQuery 中解密的加密方法?
我和你有同样的问题,并且在this issue的帮助下取得了一些进展。
要在 Python 中加密,运行 此代码:
import io
import base64
import json
import tink
from tink import aead, cleartext_keyset_handle
# sourced from https://github.com/google/tink/issues/373
aead.register()
# Create key
keyset_handle = tink.new_keyset_handle(aead.aead_key_templates.AES256_GCM)
aead_primitive = keyset_handle.primitive(aead.Aead)
# encrypt your text
plaintext = b'hello'
associated_data = b'context'
ciphertext = aead_primitive.encrypt(plaintext, associated_data)
print(ciphertext)
# print the key
out = io.BytesIO()
writer = tink.BinaryKeysetWriter(out)
cleartext_keyset_handle.write(writer, keyset_handle)
out.seek(0)
print(base64.b64encode(out.read()))
输出为:
b'\x01T0\xedK\x06\xb9;.j\xec^f\xd3\x01\xf4)\xeb\n\x86\r>E\xd5\x95\xc3\x8f.\x8c\x8bL(O"\xdc0]!'
b'CMvaw6EFEmQKWAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EiIaICn4WTH+lR6jWA5kV7k3WEAaPXUg1B0y6KKGBPCWD8RuGAEQARjL2sOhBSAB'
现在在 BigQuery 中,您可以使用 AEAD.DECRYPT_STRING 和 FROM_BASE64() 函数解密,如下所示(为简单起见,我粘贴了在 [=29= 中获得的密钥、密文和其他数据) ]):
select AEAD.DECRYPT_STRING(
FROM_BASE64('CMvaw6EFEmQKWAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EiIaICn4WTH+lR6jWA5kV7k3WEAaPXUg1B0y6KKGBPCWD8RuGAEQARjL2sOhBSAB'),
b'\x01T0\xedK\x06\xb9;.j\xec^f\xd3\x01\xf4)\xeb\n\x86\r>E\xd5\x95\xc3\x8f.\x8c\x8bL(O"\xdc0]!',
'context'
)
结果为解密文本:
我需要一个管道
- 从 API 获取敏感数据
- de-identify/encrypt 基于特定条件的特定字段
- 上传数据 post 加密(换行符分隔 JSON 格式)到 BigQuery table
除了上述之外,我还需要能够 re-identify/decrypt BigQuery 中的数据(例如 UDF,AEAD functions)。
现在的问题是我无法弄清楚如何在 Python 中以一种可以在 BigQuery 中 re-identified/decrypted 的方式加密此数据。
到目前为止,我已经看到许多使用 Dataflow/DLP/Cloud KMS 或 Python 库(例如 Fernet)加密数据的管道示例。这些相同的示例还展示了管道如何解密数据。但是,它们不提供直接在 BQ 中解密数据的方法。
我还了解了如何使用 BQ AEAD 函数 encrypt/decrypt 数据。我还没有想出如何在 Python 中加密数据,以便可以在 BQ 中解密它。
我考虑过在 BQ 中而不是 Airflow/Python 中通过暂存 tables 进行加密过程,但是由于必须加密的嵌套字段的数量,这很复杂。
加密部分在 Python/Airflow 中更容易完成。 BigQuery 中的解密步骤很简单。
如何使用 Python 中可以在 BigQuery 中解密的加密方法?
我和你有同样的问题,并且在this issue的帮助下取得了一些进展。
要在 Python 中加密,运行 此代码:
import io
import base64
import json
import tink
from tink import aead, cleartext_keyset_handle
# sourced from https://github.com/google/tink/issues/373
aead.register()
# Create key
keyset_handle = tink.new_keyset_handle(aead.aead_key_templates.AES256_GCM)
aead_primitive = keyset_handle.primitive(aead.Aead)
# encrypt your text
plaintext = b'hello'
associated_data = b'context'
ciphertext = aead_primitive.encrypt(plaintext, associated_data)
print(ciphertext)
# print the key
out = io.BytesIO()
writer = tink.BinaryKeysetWriter(out)
cleartext_keyset_handle.write(writer, keyset_handle)
out.seek(0)
print(base64.b64encode(out.read()))
输出为:
b'\x01T0\xedK\x06\xb9;.j\xec^f\xd3\x01\xf4)\xeb\n\x86\r>E\xd5\x95\xc3\x8f.\x8c\x8bL(O"\xdc0]!'
b'CMvaw6EFEmQKWAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EiIaICn4WTH+lR6jWA5kV7k3WEAaPXUg1B0y6KKGBPCWD8RuGAEQARjL2sOhBSAB'
现在在 BigQuery 中,您可以使用 AEAD.DECRYPT_STRING 和 FROM_BASE64() 函数解密,如下所示(为简单起见,我粘贴了在 [=29= 中获得的密钥、密文和其他数据) ]):
select AEAD.DECRYPT_STRING(
FROM_BASE64('CMvaw6EFEmQKWAowdHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUuY3J5cHRvLnRpbmsuQWVzR2NtS2V5EiIaICn4WTH+lR6jWA5kV7k3WEAaPXUg1B0y6KKGBPCWD8RuGAEQARjL2sOhBSAB'),
b'\x01T0\xedK\x06\xb9;.j\xec^f\xd3\x01\xf4)\xeb\n\x86\r>E\xd5\x95\xc3\x8f.\x8c\x8bL(O"\xdc0]!',
'context'
)
结果为解密文本: