首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python/气流中加密数据并在BigQuery中解密的方法

在Python/气流中加密数据并在BigQuery中解密的方法
EN

Stack Overflow用户
提问于 2021-04-29 17:06:07
回答 1查看 960关注 0票数 4

我需要一条管道

  • 从API获取敏感数据。
  • 根据特定条件取消识别/加密特定字段
  • 将数据后加密(新行分隔的JSON格式)上载到BigQuery表中

除此之外,我还需要能够重新识别/解密BigQuery中的数据(例如UDF、AEAD函数)。

现在的问题是,我无法弄清楚如何以一种可以在BigQuery中重新识别/解密的方式来加密这个数据。

到目前为止,我已经看到了许多使用Dataflow/DLP/Cloud或Python库(例如Fernet)加密数据的管道示例。这些同样的例子也展示了管道如何解密数据。然而,它们并没有提供一种方法来直接解密BQ中的数据。

我还看到了如何使用BQ函数加密/解密数据。我还没有弄清楚如何用Python加密数据,以便在BQ中对其进行解密。

我已经考虑过通过暂存表来执行be加密过程,而不是Airflow/Python,但是由于需要加密的嵌套字段的数量太多,所以这个过程很复杂。

在Python/Airflow中,加密部分更容易完成。在BigQuery中,解密步骤很简单。

如何使用BigQuery中可以解密的加密方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-24 14:56:08

我和你有同样的问题,多亏了本期,我已经取得了一些进展。

要在Python中加密,请运行以下代码:

代码语言:javascript
复制
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()))

产出如下:

代码语言:javascript
复制
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()函数解密,如下所示(为了简单起见,我粘贴了密钥、密文和其他用Python获得的数据):

代码语言:javascript
复制
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' 
    )

结果是解密的文本:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67322013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档