用户如何证明特定帐户有权访问 BigQuery? (AEAD加密和授权查看)
How can users prove a specific account has access to BigQuery? (AEAD encryption and authorized views)
我是 运行 多人需要访问 BigQuery 的活动,我希望他们向我发送他们有权访问的证明:
- 我想收集可以访问 BigQuery 的参与者的电子邮件地址。
- 我想要证明他们使用了 BigQuery。
用户如何证明他们的特定电子邮件帐户可以访问 BigQuery?
我想知道我们是否可以构建一个具有授权视图和加密功能的解决方案。
我们将使用授权视图和 new AEAD encryption functions。
首先,让我们创建一个只有我能在我的私人数据集中看到的密钥:
CREATE TABLE `secrets.keys`
AS
SELECT KEYS.NEW_KEYSET('AEAD_AES_GCM_256') key, CURRENT_TIMESTAMP() ts, 'for_a_view' label
现在我可以在利用 SESSION_USER()
和 AEAD.ENCRYPT()
的 public 数据集中创建视图:
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')
为了让我的观点 public 和密钥保密,我可以在我的秘密数据集中设置访问这个新的 authorized view 来读取密钥:
现在任何人都可以运行以下查询:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
哪个returns:
AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA==
我可以要求用户与我共享该值,我也可以与您共享该值 - 但只有我可以使用我的密钥解密它。
正在用我的密钥解密:
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)
哪个returns:
⬛⬛⬛⬛⬛⬛⬛⬛e@gmail.com|2019-05-14 03:51:15.047791+00
请注意,这是他们用于 运行 他们查询的确切帐户和时间戳!
这就是方法 - 如果我需要证明你告诉我你用来使用 BigQuery 的帐户确实是那个帐户,我会请你 运行 以下查询并分享它我的结果:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
我是 运行 多人需要访问 BigQuery 的活动,我希望他们向我发送他们有权访问的证明:
- 我想收集可以访问 BigQuery 的参与者的电子邮件地址。
- 我想要证明他们使用了 BigQuery。
用户如何证明他们的特定电子邮件帐户可以访问 BigQuery?
我想知道我们是否可以构建一个具有授权视图和加密功能的解决方案。
我们将使用授权视图和 new AEAD encryption functions。
首先,让我们创建一个只有我能在我的私人数据集中看到的密钥:
CREATE TABLE `secrets.keys`
AS
SELECT KEYS.NEW_KEYSET('AEAD_AES_GCM_256') key, CURRENT_TIMESTAMP() ts, 'for_a_view' label
现在我可以在利用 SESSION_USER()
和 AEAD.ENCRYPT()
的 public 数据集中创建视图:
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')
为了让我的观点 public 和密钥保密,我可以在我的秘密数据集中设置访问这个新的 authorized view 来读取密钥:
现在任何人都可以运行以下查询:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
哪个returns:
AQElE+8cn+uHouGhZO7895UNjVs3/k05ZJLkEceQ8kszHJjQkbvuB6Vx/miDi3DhFTty7ZifXps1VKWC5OtTrQOkCQqoFFQu+VkDfz9F65R5f3PGPA==
我可以要求用户与我共享该值,我也可以与您共享该值 - 但只有我可以使用我的密钥解密它。
正在用我的密钥解密:
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)
哪个returns:
⬛⬛⬛⬛⬛⬛⬛⬛e@gmail.com|2019-05-14 03:51:15.047791+00
请注意,这是他们用于 运行 他们查询的确切帐户和时间戳!
这就是方法 - 如果我需要证明你告诉我你用来使用 BigQuery 的帐户确实是那个帐户,我会请你 运行 以下查询并分享它我的结果:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`