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;

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

相关推荐