首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大查询中的字段级加密

大查询中的字段级加密
EN

Stack Overflow用户
提问于 2018-11-13 05:23:41
回答 1查看 3.4K关注 0票数 2

我们的团队目前正在探索在BigQuery中字段级别上加密PII数据的方法,我们发现了以下使用密码JS加密/解密的方法

代码语言:javascript
复制
#standardSQL
CREATE TEMPORARY FUNCTION encrypt(_text STRING) RETURNS STRING LANGUAGE js AS
"""
  let key = CryptoJS.enc.Utf8.parse("<key>");
  let options = { iv: CryptoJS.enc.Utf8.parse("<iv>"), mode: CryptoJS.mode.CBC };
  let _encrypt = CryptoJS.AES.encrypt(_text, key, options);
  return _encrypt;
""";
CREATE TEMPORARY FUNCTION decrypt(_text STRING) RETURNS STRING LANGUAGE js AS
"""
  let key = CryptoJS.enc.Utf8.parse("<key>");
  let options = { iv: CryptoJS.enc.Utf8.parse("<iv>"), mode: CryptoJS.mode.CBC };
  let _decrypt = CryptoJS.AES.decrypt(_text, key, options).toString(CryptoJS.enc.Utf8);
  return _decrypt;
""" OPTIONS (library="gs://path/to/Crypto-JS/crypto-js.js");

-- query to encrypt fields
SELECT
  <fields>, encrypt(<pii-fields>)
FROM
  `<project>.<dataset>.<table>`

-- query to decrypt fields
SELECT
      <fields>, decrypt(<pii-fields>)
    FROM
      `<project>.<dataset>.<table>`

在将其部署到我们的产品中之前,我试图在大查询中使用Crypto JS库来测试AES CBC加密和解密的性能。我们发现,与通常的查询相比,随着数据数量的增加,每条记录的数据加解密率呈指数增长。然而,随着需要处理的数据数量的不断增加,每条记录和记录处理时间的处理进度也在不断提高。

由于没有关于这方面的可用文档,社区中的某个人能帮助提供更好的方法、优化查询、在大查询中使用字段级加密和解密的最佳实践吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 00:24:46

BigQuery现在支持加密功能。从文档中可以看到,下面是一个自包含的示例,它创建了一些密钥集并使用它们加密数据。实际上,您可能希望将密钥集存储在真正的表中,以便以后可以使用它们解密密文。

代码语言:javascript
复制
WITH CustomerKeysets AS (
  SELECT 1 AS customer_id, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') AS keyset UNION ALL
  SELECT 2, KEYS.NEW_KEYSET('AEAD_AES_GCM_256') UNION ALL
  SELECT 3, KEYS.NEW_KEYSET('AEAD_AES_GCM_256')
), PlaintextCustomerData AS (
  SELECT 1 AS customer_id, 'elephant' AS favorite_animal UNION ALL
  SELECT 2, 'walrus' UNION ALL
  SELECT 3, 'leopard'
)
SELECT
  pcd.customer_id,
  AEAD.ENCRYPT(
    (SELECT keyset
     FROM CustomerKeysets AS ck
     WHERE ck.customer_id = pcd.customer_id),
    pcd.favorite_animal,
    CAST(pcd.customer_id AS STRING)
  ) AS encrypted_animal
FROM PlaintextCustomerData AS pcd;

编辑:如果您想使用AES-CBC对PKCS填充进行解密(不清楚您在示例中使用的是哪种填充),可以使用函数创建密钥集,然后调用AEAD.DECRYPT_STRINGAEAD.DECRYPT_BYTES。例如:

代码语言:javascript
复制
SELECT
  AEAD.DECRYPT_STRING(
    KEYS.ADD_KEY_FROM_RAW_BYTES(b'', 'AES_CBC_PKCS', b'1234567890123456'),
    FROM_HEX('deed2a88e73dccaa30a9e6e296f62be27db30db16f76d3f42c85d31db3f46376'),
    '')

这将返回abcdef。预计IV将是密文的前16个字节。

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

https://stackoverflow.com/questions/53274323

复制
相关文章

相似问题

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