实操Oracle 23c中实现数据脱敏

来源:这里教程网 时间:2026-03-03 21:46:14 作者:

以下是一个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;
/

关键点说明

    动态脱敏:数据在查询时动态脱敏,底层存储不受影响。

  1. 基于条件的脱敏:通过 expression参数控制策略生效范围(如用户角色、IP等)。

  2. 脱敏方式

    PARTIAL:部分脱敏,需指定保留字符的位置和替换符号。

  3. FULL:完全替换为固定值(如 *****)。

  4. REGEXP:使用正则表达式匹配脱敏(复杂场景适用)。

相关推荐