GBase 8a
其他
文章

GBase 8a 脱敏函数概念与示例

发表于2026-06-09 13:36:3239次浏览10个评论

一、应用场景
由于敏感数据是数据库安全中重要的一部分,因此对于敏感数据的脱敏是很有必要的。GBase 8a MPP Cluster提供动态数据脱敏功能供不同用户使用, 以满足不同需求。
使得开发人员或者数据库管理员能够有效控制数据库中敏感数据的暴露程 度,并且在数据库层面生成脱敏数据,大大简化了业务应用层的安全设计和编 码。
使得用户可以通过SQL语法的形式,给需要进行数据脱敏的字段添加脱敏 属性,并通过用户权限控制,决定是否对有查询要求的用户暴露原始数据。
-----------------------------------
二、脱敏功能
动态数据脱敏并不会真正改动表中存储的实际数据,只是在查询的时候应 用该特性控制查询返回的数据。
动态数据脱敏是否启用受当前用户权限影响,super用户和拥有unmask权 限的用户不受脱敏规则影响可以访问实际数据,没有unmask权限的用户受脱敏 规则影响只能访问到脱敏后的数据。脱敏只对投影列有效。

MASKED WITH(FUNCTION = 'TYPE (参数)') 

动态数据脱敏支持四种类型数据脱敏函数,如下: 

1) 默认脱敏default类型。 这种类型没有参数。 MASKED WITH(FUNCTION = 'DEFAULT。') 

2) 随机脱敏random类型。 random(min,max)有两个参数标定随机范围,参数min的最小值为1,参数 max的最大值为1。。。 MASKED WITH(FUNCTION = 'RANDOMd, 100)') 

3) 自定义脱敏partial类型。 这种类型包含三个参数,partial (prefix, padding, suffix),参数详细 说明如下: 

• prefix表示前缀保留显示字符数量; 

• padding表示脱敏显示字符; 

• suffix表示结尾保留显示字符数量。 

MASKED WITH(FUNCTION = 'PARTIAL(1,'XXXX',1)') 

4) 哈希脱敏sha类型。 这个类型没有参数。 MASKED WITH(FUNCTION = 'SHA()') 

5) 自定义脱敏keymask类型。 keymask(substr,padding, pos) masked with(function=' keymask(〃@gbase〃,〃****〃,0)')

三、默认(DEFAULT)脱敏函数示例

1.    若数据类型包含date、datetime和time。
•    date 会以 “1900-01-01 ”显示;
•    datetime 会以 “1900-01-01 00:00:00” 显示;
•    time 会以 “00:00:00” 显示。
2.    若数据类型是整型、浮点型和decimal。
•    整型和浮点型会显示0;
• decimal会显示为0.000...,带有结果小数位(定义的类型或者评估的 类型)个数0。
3.    若数据类型是字符串类型的。将会替换为固定4个X字符"xxxx”。
4.    NULL值。不做脱敏处理,显示为NULL。
5.    SQL函数。如果SQL函数的任一参数含有脱敏属性,则按照函数返 同结果类型,执行默认脱敏。
示例
gbase> CREATE TABLE t_m_default(name VARCHAR(10) MASKED
WITH(FUNCTION = 'DEFAULT()'),b_date DATETIME MASKED
WITH(FUNCTION = 'DEFAULT()'),age INT MASKED WITH(FUNCTION ='DEFAULT0'));
gbase> INSERT INTO t_m_default VALUES('Jone smith','1989-03-04 12:31:24.123000',29);
gbase> SELECT * FROM t_m_default;
+    +    +    +
| name | b_date    | age |
+    +    +    +
| xxxx | 1900-01-01 00:00:00 |    0 |
+    +    +    +
脱敏前
姓名(varchar)    出生日期(datetime)    年龄(int)
Jone smith    1989-03-04 12:31:24.123000    29

脱敏后
姓名(varchar)    出生日期(datetime)    年龄(int)
xxxx    1900-01-01 00:00:00    0

四、随机(RANDOM)脱敏函数示例

它会将数字随机显示成指定范围内的值,若多次执行,同一行的随机值会 不同。假设先设置脱敏范围为(1,    4):
gbase> CREATE TABLE t_m_random(age INT MASKED
WITH(FUNCTION = 'RANDOM(1,4)'));
gbase> INSERT INTO t_m_random VALUES(29),(19);
Records: 2 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM t_m_random;
+    +
I age I
+    +
I    4 I
1    3 I
+    +

脱敏前数据
年龄(int)
29
19
应用随机脱敏后结果
年龄(int)
4
3
△注意
NULL值不做脱敏处理,显示仍为NULL。

五、自定义(PARTIAL)脱敏

设定 prefix 为 3, suffix 为 6, padding 字符 "XXXX”。
gbase> CREATE TABLE t_m_partial(context VARCHAR(255) MASKED
WITH(FUNCTION = 'PARTIAL(3,"XXXX",6)'));
gbase> INSERT INTO t_m_partial VALUES('This is a book on the desk'),('Hello');
Records: 2 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM t_m_partial;
+    +
| context    |
+    +
| ThiXXXX desk. |
|XXXX    |
+    +
脱敏前数据
内容(varchar(255))
This is a book on the desk.
Hello 
应用自定义脱敏后结果
内容(varchar(255))
ThiXXXX desk.
XXXX
八'注意
NULL值不做脱敏处理,显示为NULL。

六、SHA 脱敏

gbase> CREATE TABLE t_m_sha(context VARCHAR(255) MASKED WITH(FUNCTION
='SHAO'));
gbase> INSERT INTO t_m_sha VALUES('abc');
gbase> SELECT * FROM t_m_sha;
+    +
| context    |
+    +
|a9993e364706816aba3e25717850c26c9cd0d89d |
+    +
脱敏前数据
内容(varchar(255))
abc
应用SHA脱敏后显示结果
内容(varchar(255))
内容(varchar(255))
“a9993e364706816aba3e25717850c26c9cd0d89d”
△注意
NULL值不做脱敏处理,仍显示为NULL。

七、相关属性

建表,只需要有create权限:
create table t1(a int masked with(function= 'default()'));
create table t2(a varchar(255) masked with(function= 'sha()'));
create table t3(a int masked with(function= 'random(1,10) '));
create table t4(a varchar(255) masked with(function= 'partial(2,"XXX", 3)'));
说明:create table like 继承 mask 属性
Alter可以添加和修改mask属性,mask的语法内容同建表,需要同时拥有 alter 和 unmask 权限。
Alter table t1 alter a masked with(function= 'sha()');
显示mask属性。
Show create table <tablename>;
例如:
gbase> show create table t4;
+    +    
    +
| Table | Create Table
I
+    +    
    +
| t4    | CREATE TABLE "t4"(
"a" varchar(255) DEFAULT NULL MASKED WITH(FUNCTION='DEFAULT()')
)ENGINE二EXPRESS DEFAULT CHARSET二utf8 TABLESPACE='sys_tablespace' |
删除mask属性。
Alter table 表名 alter 列名 drop masked;
超级用户或其他拥有unmask权限的用户可以查看原始未脱敏数据
grant unmask on *.* to user;
例如:
create user user2;
grant unmask on *.* to user2;
show grants for user2;
结果:
+    +
| Grants for user2@%    |
+    +
| GRANT UNMASK ON *.* TO 'user2'@'%' |
+    +

 

评论

登录后才可以发表评论
GBase用户51966发表于 1个月前
干货满满,感谢楼主分享。
GBase用户50900发表于 1个月前
写得真不错,赞一个!
GBase用户51511发表于 1个月前
不错的文章,受益匪浅。
GBase用户51510发表于 1个月前
内容详实,值得收藏。
一个老汉发表于 1个月前
好文章,支持一下!
佛洛伊得发表于 1个月前
感谢分享,非常有帮助。
塔山发表于 1个月前
内容详实,值得收藏。
gbase0001发表于 1个月前
感谢郝老师分享。
用户头像
XX发表于 1个月前
感谢分享
gbase0001发表于 1个月前
感谢老师分享