Мы собираемся использовать авторизованные представления и новую функцию шифрования AEAD s.
Сначала давайте создадим ключ, который только я могу видеть в одном из моих личных наборов данных:
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()
:
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')
Чтобы сохранить открытость моего представления и ключи в секрете, я могу установить вмой набор данных секретов имеет доступ к этому новому авторизованному представлению для чтения ключа:
![enter image description here](https://i.stack.imgur.com/wTBAI.png)
Теперь любой может выполнить следующий запрос:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`
Что возвращает:
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)
, который возвращает:
⬛⬛⬛⬛⬛⬛⬛⬛e@gmail.com|2019-05-14 03:51:15.047791+00
Обратите внимание, что это именно та учетная запись и метка времени, которые они использовали для выполнения своего запроса!
И вот как - если мне когда-нибудь понадобятся доказательства того, что учетная запись, которую вы мне сообщаете, используете BigQuery, является независимойВ этой учетной записи я попрошу вас выполнить следующий запрос и поделиться со мной его результатом:
SELECT enc_user_ts
FROM `fh-bigquery.public_dump.encrypting_user_view`