以下是一个Oracle 23c中实现数据脱敏的实际操作案例,使用
DBMS_REDACT
包对敏感数据进行动态脱敏:
步骤 1:创建测试表和测试数据
-- 创建用户并授权 CREATE USER hr IDENTIFIED BY hr_password; GRANT CONNECT, RESOURCE TO hr; -- 切换至hr用户 CONNECT hr/hr_password; -- 创建测试表 CREATE TABLE customers ( customer_id NUMBER PRIMARY KEY, full_name VARCHAR2(50), phone_number VARCHAR2(15), id_card VARCHAR2(20) ); -- 插入测试数据 INSERT INTO customers VALUES (1, '张三', '13812345678', '110101199001011234'); INSERT INTO customers VALUES (2, '李四', '13987654321', '310105198502022345'); COMMIT;
步骤 2:创建数据脱敏策略
1. 对电话号码部分脱敏(显示为前3后4位,中间用*填充)
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'hr',
object_name => 'customers',
column_name => 'phone_number',
policy_name => 'redact_cust_phone',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'VVVVFVVVVVVVVVV, 1, 3, *, 4', -- 保留前3位和后4位
expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''HR_ADMIN''' -- 非HR_ADMIN用户触发脱敏
);
END;
/
2. 对身份证号部分脱敏(显示前6位和后4位,中间用*填充)
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'hr',
object_name => 'customers',
column_name => 'id_card',
policy_name => 'redact_cust_id',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'VVVVVVFVVVVVVVVVVVV, 1, 6, *, 4', -- 保留前6位和后4位
expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''HR_ADMIN'''
);
END;
/
步骤 3:创建授权用户并验证脱敏效果
1. 创建普通用户和特权用户
-- 创建普通用户 CREATE USER user1 IDENTIFIED BY user1_password; GRANT SELECT ON hr.customers TO user1; -- 创建特权用户HR_ADMIN CREATE USER hr_admin IDENTIFIED BY admin_password; GRANT SELECT ON hr.customers TO hr_admin; GRANT EXECUTE ON DBMS_REDACT TO hr_admin; -- 确保有权限管理策略(实际环境需谨慎授权)
2. 普通用户查询(脱敏后数据)
CONNECT user1/user1_password SELECT * FROM hr.customers; -- 结果示例: -- CUSTOMER_ID | FULL_NAME | PHONE_NUMBER | ID_CARD ------------------------------------------------- -- 1 | 张三 | 138****5678 | 110101********1234 -- 2 | 李四 | 139****4321 | 310105********2345
3. 特权用户HR_ADMIN查询(原始数据)
CONNECT hr_admin/admin_password SELECT * FROM hr.customers; -- 结果示例: -- CUSTOMER_ID | FULL_NAME | PHONE_NUMBER | ID_CARD ------------------------------------------------- -- 1 | 张三 | 13812345678 | 110101199001011234 -- 2 | 李四 | 13987654321 | 310105198502022345
步骤 4:管理脱敏策略(可选)
修改策略:
BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'hr', policy_name => 'redact_cust_phone', action => DBMS_REDACT.MODIFY_EXPRESSION, expression => '1=1' -- 修改条件为始终脱敏(测试用) ); END; /
删除策略 :
BEGIN DBMS_REDACT.DROP_POLICY( object_schema => 'hr', policy_name => 'redact_cust_phone' ); END; /
关键点说明
-
基于条件的脱敏:通过
expression参数控制策略生效范围(如用户角色、IP等)。 -
脱敏方式:
PARTIAL:部分脱敏,需指定保留字符的位置和替换符号。 -
FULL:完全替换为固定值(如*****)。 -
REGEXP:使用正则表达式匹配脱敏(复杂场景适用)。
动态脱敏:数据在查询时动态脱敏,底层存储不受影响。
