使用外部函数在Databend实现数据的加密和解密
· 阅读需 4 分钟
有时我需要在数据库或应用层实现对数据的加密和解密。工程中实现方式有很多,这里提供一个基于 Databend 使用 External UDF 的实现方案。
1. 整体概览
通过 python 实现一个外置的 udf 然后注册的到 Databend 中,在 Databend 中调用这个函数。
1.1 UDF server 定义及依赖
文章中把 udf server 放到 192.168.1.201 这台机器上,这台机器上需要安装 databend udf 相关依赖
pip install databend-udf
1.2 定义 encode_decode_udf_server.py
cat encode_decode_udf_server.py
import base64
from databend_udf import *
# 加密函数:将字符串编码为 base64
@udf(input_types=["STRING"], result_type="STRING", skip_null=True)
def encode_str(s: str) -> str:
if s is None:
return None
return base64.b64encode(s.encode("utf-8")).decode("utf-8")
# 解密函数:将 base64 字符串解码为原始字符串
@udf(input_types=["STRING"], result_type="STRING")
def decode_str(s: str) -> str:
if s is None:
return None
return base64.b64decode(s.encode("utf-8")).decode("utf-8")
# 注册 UDF
if __name__ == "__main__":
# 启动 UDF 服务器
server = UDFServer("0.0.0.0:8815")
# 注册加密和解密函数
server.add_function(encode_str)
server.add_function(decode_str)
# 启动服务
server.serve()
1.3 启动 udf server
python encode_decode_udf.py
1.4 Databend 中配置对应的 udf server 地址
在对应的 databend-query 配置文件中: databend-query.toml 全局部分添加
# udf server
enable_udf_server = true
udf_server_allow_insecure = true
udf_server_allow_list = ['http://192.168.1.201:8815']
这里主要出于安全考虑不允许随意注册 udf server 做的限制。
1.5 在 databend-query 中注册 udf
CREATE FUNCTION encode_str(string) RETURNS STRING LANGUAGE PYTHON HANDLER = 'encode_str' ADDRESS = 'http://192.168.1.201:8815';
CREATE FUNCTION decode_str(string) RETURNS STRING LANGUAGE PYTHON HANDLER = 'decode_str' ADDRESS = 'http://192.168.1.201:8815';
2. 使用 encode_str , decode_str
select encode_str('abc') c1, decode_str(c1);
2.1 在表中使用
CREATE TABLE test_data (
id INT,
c1 STRING
);
INSERT INTO test_data select 1, encode_str('Hello, Databend!');
select id, c1, decode_str(c1) from test_data;
┌───────────────────────────────────────────────────────────────┐
│ id │ c1 │ decode_str(c1) │
│ Nullable(Int32) │ Nullable(String) │ Nullable(String) │
├─────────────────┼──────────────────────────┼──────────────────┤
│ 1 │ SGVsbG8sIERhdGFiZW5kIQ== │ Hello, Databend! │
└───────────────────────────────────────────────────────────────┘
1 row read in 0.012 sec. Processed 1 row, 42 B (83.33 rows/s, 3.42 KiB/s)
总结
Databend remote udf 是给提供一个数据读取 Databend 中的数据,把计算外移到 Python 中处理。给数据处理也提供了更多的灵活性。基于这个特性也可以实现更多的探索,例如 AI 方向的整合等。 这里只是简单的给一个 demo , 实质上加密解密可能是一个非常复杂的逻辑,这块需要根据实现的实现。
Tips: 这些 udf server 可以借助于 AI 直接生成,基本可以直接用。 这个方向有很多玩法,也可以实现和 AI 的整合,也期待你的实践反馈。
💬 社区支持
有问题与我们的团队联系:Slack微信: 82565387