Skip to main content

使用外部函数在Databend实现数据的加密和解密

· 4 min read
wubx
Data AI

有时我需要在数据库或应用层实现对数据的加密和解密。工程中实现方式有很多,这里提供一个基于 Databend 使用 External UDF 的实现方案。

1. 整体概览​

通过 python 实现一个外置的 udf 然后注册的到 Databend 中,在 Databend 中调用这个函数。

1.1 UDF server 定义及依赖​

文章中把 udf server 放到 192.168.1.201 这台机器上,这台机器上需要安装 databend udf 相关依赖

https://docs.databend.com/guides/query/external-function

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