欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-27 12:10:26
对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名、证件号、地址等等,下面是自定义函数的代码 create or...

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

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自定义脱敏函数的代码详解,希望对大家有所帮助