Oracle自定义脱敏函数的代码详解

所属分类: 数据库 / oracle 阅读数: 2128
收藏 0 赞 0 分享

对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名、证件号、地址等等,下面是自定义函数的代码

CREATE OR REPLACE FUNCTION F_GET_SENSITIVE(IN_STR VARCHAR, IN_TYPE NUMBER)
 RETURN VARCHAR2 IS
 V_STR_LENGTH NUMBER;
 V_NAME    VARCHAR2(1000);
 V_N     NUMBER;
 V_HID    VARCHAR2(200);
 V_SQL    VARCHAR2(200);
 V_NUM_FLAG  NUMBER;
 /****
 N_TYPE 脱敏字段类型
 1 :名称
 11:地址
 2 :证件
 3 :银行账号
 4 :联系电话
 5 :接入号码
 ***/
BEGIN
 V_STR_LENGTH := LENGTH(IN_STR);
 V_N     := 0;
 IF V_STR_LENGTH=0 THEN
   RETURN(NULL);
 END IF;
 /**********名称和地址脱敏规则**********/
 IF IN_TYPE = 1 OR IN_TYPE=11 THEN
  IF V_STR_LENGTH = 2 OR V_STR_LENGTH = 3 THEN
   V_NAME := REGEXP_REPLACE(IN_STR, '(.)', '*', 2, 1);
  ELSIF V_STR_LENGTH < 2 THEN
   V_NAME :=IN_STR;
  ELSE
   WHILE V_N < V_STR_LENGTH / 2 LOOP
    V_N  := V_N + 1;
    V_HID := V_HID || '*';
   END LOOP;
   V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 2) || V_HID;
  END IF;
  RETURN(V_NAME);
 END IF;
 /**********证件脱敏规则**********/
 IF IN_TYPE = 2 THEN
  IF V_STR_LENGTH = 15 THEN
   V_NAME := SUBSTR(IN_STR, 0, 6) || '******' || SUBSTR(IN_STR, -3, 3);
  ELSIF V_STR_LENGTH = 18 THEN
   V_NAME := SUBSTR(IN_STR, 0, 6) || '********' || SUBSTR(IN_STR, -4, 4);
  ELSE
   WHILE V_N < V_STR_LENGTH / 3 LOOP
    V_N  := V_N + 1;
    V_HID := V_HID || '*';
   END LOOP;
   V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH / 3) || V_HID ||
        SUBSTR(IN_STR, -V_STR_LENGTH / 3, V_STR_LENGTH / 3);
  END IF;
  RETURN(V_NAME);
 END IF;
 /**********银行账号脱敏规则**********/
 IF IN_TYPE = 3 THEN
  IF V_STR_LENGTH > 15 THEN
   V_NAME := SUBSTR(IN_STR, 0, 4) || '********' || SUBSTR(IN_STR, -4, 4);
  ELSE
   V_NAME :=IN_STR;
  END IF;
   RETURN(V_NAME);
 END IF;
 /**********联系电话脱敏规则**********/
 IF IN_TYPE = 4 THEN
  V_NAME := SUBSTR(IN_STR, 0, V_STR_LENGTH - 4) || '****';
  RETURN(V_NAME);
 END IF;
 /**********接入号码脱敏规则**********/
 IF IN_TYPE = 5 THEN
  V_SQL := 'SELECT COUNT(1) FROM DUAL WHERE LENGTH(''' || IN_STR ||
       ''') = LENGTH(REGEXP_REPLACE(''' || IN_STR || ''', ''[^0-9]''))';
  EXECUTE IMMEDIATE V_SQL
   INTO V_NUM_FLAG;
  IF V_NUM_FLAG = 1 AND (V_STR_LENGTH = 7 OR V_STR_LENGTH = 8) THEN
   V_NAME := SUBSTR(IN_STR, 0, 2) || '****' || SUBSTR(IN_STR, -2, 2);
  ELSIF V_NUM_FLAG = 1 AND V_STR_LENGTH = 11 THEN
   V_NAME := SUBSTR(IN_STR, 0, 3) || '*****' || SUBSTR(IN_STR, -3, 3);
  ELSE
   V_NAME := IN_STR;
  END IF;
   RETURN(V_NAME);
 END IF;
 RETURN(IN_STR);
EXCEPTION
 WHEN OTHERS THEN
  -- DBMS_OUTPUT.PUT_LINE('1'||V_SQL);
  V_NAME := '-1';
  RETURN V_NAME;
END F_GET_SENSITIVE;

以上所述是小编给大家介绍的Oracle自定义脱敏函数的代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

Oracle 子程序参数模式,IN,OUT,NOCOPY

Oracle 子程序参数模式主要有IN,OUT,NOCOPY,IN和OUT可以组合,OUT和NOCOPY也可以组合使用.
收藏 0 赞 0 分享

Oracle 存储过程加密方法

Oracle 存储过程加密方法,需要的朋友可以参考下。
收藏 0 赞 0 分享

oracle 多个字符替换实现

CSDN上的一个网友,需要一个sql语句的解决方案需求是这样的求写oracle多个字符替换(有测试数据)
收藏 0 赞 0 分享

Oracle 存储过程教程

一个简单的oracle分页存储过程的实现和调用。在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle的存储过程,因为我用到的数据库是oracle。
收藏 0 赞 0 分享

oracle 更改数据库名的方法

这两天一朋友问如何更改数据库名,于是做个测试,简单记录下,以便说明问题。
收藏 0 赞 0 分享

Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法,需要的朋友可以参考下。
收藏 0 赞 0 分享

Oracle字符集修改查看方法

Oracle字符集修改查看方法,需要的朋友可以参考下。
收藏 0 赞 0 分享

一些实用的sql语句

一些实用的sql,需要的朋友可以参考下。
收藏 0 赞 0 分享

Oracle中sys和system的区别小结

SYS用户具有DBA权限,并且拥有SYS模式,只能通过SYSDBA登陆数据库。是Oracle数据库中权限最高的帐号 SYSTEM具有DBA权限。但没有SYSDBA权限。平常一般用该帐号管理数据库就可以了。
收藏 0 赞 0 分享

oracle 存储过程和触发器复制数据

oracle 存储过程和触发器复制数据的代码,需要的朋友可以参考下。
收藏 0 赞 0 分享
查看更多