对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名、证件号、地址等等,下面是自定义函数的代码
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;
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!
网友评论