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

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

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;

总结

以上所述是www.887551.com给大家介绍的oracle自定义脱敏函数的代码详解,希望对大家有所帮助

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐