在 Python/Airflow 中加密数据并在 BigQuery 中解密的方法

Method to encrypt data in Python/Airflow and decrypt in BigQuery

我需要一个管道

除了上述之外,我还需要能够 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' 
    )

结果为解密文本: