用户如何证明特定帐户可以访问BigQuery?(AEAD加密和授权视图)

Fel*_*ffa 4 encryption sql-view google-bigquery

我正在举办一个活动,需要多个人访问BigQuery,我希望他们向我发送证明他们可以访问的证据:

  • 我想收集可以访问BigQuery的参与者的电子邮件地址。
  • 我想证明他们使用过BigQuery。

用户如何证明其特定的电子邮件帐户有权访问BigQuery?

我想知道我们是否可以构建具有授权视图和加密功能的解决方案。

Fel*_*ffa 7

我们将使用授权的视图和新的AEAD加密功能。

首先,让我们创建一个只有我自己的私有数据集中才能看到的密钥:

CREATE TABLE `secrets.keys`
AS 
SELECT KEYS.NEW_KEYSET('AEAD_AES_GCM_256') key, CURRENT_TIMESTAMP() ts, 'for_a_view' label
Run Code Online (Sandbox Code Playgroud)

现在,我可以在利用SESSION_USER()和的公共数据集中创建视图AEAD.ENCRYPT():

SELECT SESSION_USER() user, ts, key_ts, key_label
  , AEAD.ENCRYPT(key, FORMAT('%s|%t', SESSION_USER(), ts), '') enc_user_ts
  , AEAD.ENCRYPT(key, SESSION_USER(), '') enc_user
  , AEAD.ENCRYPT(key, CAST(ts AS STRING), '') enc_ts

FROM (SELECT CURRENT_TIMESTAMP() ts)
, (SELECT ts key_ts, key, label key_label FROM `fh-bigquery.secrets.keys`  WHERE label='for_a_view')
Run Code Online (Sandbox Code Playgroud)

为了使我的视图公开且密钥是秘密的,我可以在我的秘密数据集中设置对该新授权视图的访问权限以读取密钥:

在此处输入图片说明

现在任何人都可以运行以下查询:

SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
Run Code Online (Sandbox Code Playgroud)

哪个返回:

AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA==
Run Code Online (Sandbox Code Playgroud)

我可以要求用户与我共享该价值,也可以与您共享该价值-但只有我才能使用我的密钥对其进行解密。

用我的密钥解密:

SELECT AEAD.DECRYPT_STRING(key, FROM_BASE64('AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA=='), '')
FROM (SELECT key FROM `fh-bigquery.secrets.keys` WHERE label='for_a_view' LIMIT 1)
Run Code Online (Sandbox Code Playgroud)

哪个返回:

????????e@gmail.com|2019-05-14 03:51:15.047791+00   
Run Code Online (Sandbox Code Playgroud)

请注意,这是他们用来运行查询的确切帐户和时间戳!

这就是方法-如果我需要证明您告诉我的用来使用BigQuery的帐户确实是该帐户,我将要求您运行以下查询并与我分享其结果:

SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
Run Code Online (Sandbox Code Playgroud)