解密 BigQuery 上使用 GCloud KMS 在 Python 脚本上加密的字段

问题描述 投票:0回答:1

因此,我编写了一个 python 脚本来进行一些 API 调用、收集大量数据、加密一些敏感字段并将其写入 BigQuery 表中。 直到这里一切都很顺利。

现在我需要创建一个视图,查询该表中的所有字段并对上一步中加密的字段应用解密。

为了加密数据,我使用了 python 库

google-cloud-kms
,如下所示:

import base64
from google.cloud import kms_v1

class kms_util:
    def __init__(self, project_id:str, location:str, key_ring:str, crypto_key:str) -> None:
        self.__project_id = project_id
        self.__location = location
        self.__key_ring = key_ring
        self.__crypto = crypto_key
        self.client_kms = kms_v1.KeyManagementServiceClient()
        self.__key_name = self.client_kms.crypto_key_path(project=self.__project_id, location=self.__location, key_ring=self.__key_ring, crypto_key=self.__crypto)

    def encrypt_data(self, data):
        plaintext = str(data).encode('utf-8')
        response = self.client_kms.encrypt(request={'name': self.__key_name, 'plaintext': plaintext})
        return str(base64.b64encode(response.ciphertext),'utf8')

    def decrypt_data(self, ciphertext):
        response = self.client_kms.decrypt(request={'name': self.__key_name, 'ciphertext': base64.b64decode(ciphertext)})
        return response.plaintext.decode('utf-8')

稍微解释一下,它是一个需要所有参数来指定 Google Cloud KMS 上密钥的路径的类。由此,我们可以访问 kms 客户端、

encrypt_data
decrypt_data
方法,这些方法将使用构造函数中使用的参数指定的密钥。

请注意,要加密,我只需要调用

kms_v1.client.encrypt
方法并传递密钥路径和数据进行加密。

这里的大问题是 BigQuery。我不知道如何使用相同的过程解密数据。

我的计划是创建一个 UDF 函数来解密数据,如下所示:

CREATE OR REPLACE FUNCTION `project.udf.fnc_decrypt`(ciphertext ANY TYPE)
RETURNS STRING AS (
    (
        SELECT
            # doc: AEAD.DECRYPT_STRING(keyset, ciphertext, additional_data)
            AEAD.DECRYPT_STRING(
                # doc: KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset)
                KEYS.KEYSET_CHAIN(
                    'gcp-kms://projects/<project>/locations/<location>/keyRings/<key_ring>/cryptoKeys/<crypto_key>',
                    first_level_keyset),
        FROM_BASE64(ciphertext), additional_data)
    )
);

然后在加密后的视图字段上调用:

SELECT
    foo,
    bar,
    `project.udf.fnc_decrypt`(col_to_decrypt)
FROM `project.dataset.table_with_api_data`

但咨询 BigQuery 加密函数文档 我刚刚发现 AEAD 函数,需要的不仅仅是

key
chiphertext
来执行此操作。 它还需要
first_level_keyset
associated_data
,如第二个片段所示,这是我在 python 脚本中使用 google kms 库时没有使用的东西。

有什么建议我应该如何进行吗?

提前致谢

python encryption google-bigquery user-defined-functions google-cloud-kms
1个回答
0
投票

这里有很多事情令人困惑:

  • BigQuery AEAD 方法使用的密钥集与 KMS 密钥不同。您可以使用 KMS 密钥来包装密钥集,但不能像您介绍的那样直接执行 BigQuery AEAD 加密/解密。我的意思是你的第一个脚本应该单独工作,但不能与第二个脚本一起工作。您可以创建新的密钥集,使用 KMS 密钥对其进行包装,使用它进行加密,然后将其存储在 BigQuery 中。解密后,您可以读取密钥并将其解包到密钥集中,然后使用它进行解密。

  • 附加身份验证数据 (AAD) 是 AES-GCM 定义 (RFC-7714) 的一部分,但它是可选的(且未加密)(请参阅link),并且您在第一个脚本中省略了它。如果您在加密期间提供 AAD,则在解密时也必须提供相同的 AAD。

© www.soinside.com 2019 - 2024. All rights reserved.