雪花 UDF 和数据加密

Posted

技术标签:

【中文标题】雪花 UDF 和数据加密【英文标题】:Snowflake UDFs and Data Encryption 【发布时间】:2020-08-14 10:46:00 【问题描述】:

我想知道是否可以创建 UDF 来解密通过使用私钥作为加密值插入到表中的值。我用谷歌搜索真的找不到任何东西。我发现的唯一一件事是,可能有一个使用 javascript UDF 和 CryptoJS 的选项,但我不明白是否真的可以导入要在 UDF 中使用的 CryptoJS 模块。从我在文档中收集的内容来看,这是不可能的。

是否有人知道此类功能、可能性或解决方法? 谢谢!

【问题讨论】:

您可以查看crypto.subtle,如此处所述。至少在浏览器中它是原生的。不确定雪花是否也支持它。 ***.com/a/59194711/4219202 否则,最简单的方法是使用像 Python 这样的客户端读取加密数据,解密并写回纯数据。 【参考方案1】:

您实际上并不需要 UDF 来执行此操作。 Snowflake 支持使用私钥进行加密和解密功能。 (从技术上讲,此示例显示了一个转换为私钥的私有密码。但它也支持直接密钥规范;请继续阅读):

select encrypt('Hello, world.', '531daa2aec446116');  -- Displays as binary jibberish.
select hex_encode(encrypt('Hello, world.', '531daa2aec446116'));  -- Displays as HEX. Convert to hex to store as either binary or string.
create temporary table ENCRYPTED_TABLE(COL1 binary, COL2 string);
insert into ENCRYPTED_TABLE select hex_encode(encrypt('Hello, world.', '531daa2aec446116')), hex_encode(encrypt('Hello, world.', '531daa2aec446116'));
select decrypt(COL1, '531daa2aec446116'), decrypt(hex_decode_binary(COL2), '531daa2aec446116') from ENCRYPTED_TABLE;

如果您正在寻找一种方法来解密另一个系统加密的值,那么解密函数可能会也可能不会起作用。 Snowflake 的加密和解密功能使用 AES256 密码的对称加密。如果源密码是 AES-256,您可能会得到解密工作。如果源密码是其他任何东西,它不会。您可能想尝试 ENCRYPT_RAW 函数,该函数接受密钥,而不是处理如何将密码短语转换为密钥的复杂性。

https://docs.snowflake.com/en/sql-reference/functions/encrypt.html

【讨论】:

【参考方案2】:

您可以使用公共预览功能External Tokenization。

外部标记化允许组织标记敏感数据 在将该数据加载到雪花中并动态去标记之前 使用带有外部函数的屏蔽策略在查询运行时获取数据。

甚至还有integration with Protegrity Data Security Gateway。

目前,Snowflake 支持使用 Protegrity 来管理 跨所有数据存储(例如表、 数据库、数据仓库)在您的组织中。当雪花来电 屏蔽策略中的外部函数,进行 REST API 调用 到 Protegrity 数据安全网关 (DSG)。

【讨论】:

以上是关于雪花 UDF 和数据加密的主要内容,如果未能解决你的问题,请参考以下文章

使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示

雪花 UDF 调用“显示共享”功能

我们可以像在 SQL Server 中那样加密雪花中的存储过程吗?

Redshift Python 加密/解密 UDF 错误 - 字符串包含无效或不受支持的 UTF8 代码点

MySQL 8.0.30 的数据加密有哪些变化?