db2电话号码加密脚本

加密规则描述

  1.  号码中包含“-”的,“-”之前的数字不做脱敏加密处理操作,“-”之后的数字进脱敏加密处理操作。最后在“-”后面添加
    “-”来标识为脱敏加密后的电话号码;
  2.  移动电话(即号码中不包含“-”的),前三位不做脱敏加密处理操作,后面数字进行脱敏加密处理,最后采用3位,4位,4位的方式加上“-”隔开(如111-2222-3333),
    来标识为脱敏加密后的电话号码;
  3.  将脱敏加密处理后的数据存储到数据库中,在必要的时候可以通过可逆解密,将脱敏后的电话号码解密转换成为原始电话号码。
  4.  将电话号码数字按照一定规则进行加密处理:
  5.  从理赔编码中选取倒数第二位数字判断奇偶性,使用对应的方法打乱需要进行加密的电话号码数字;

a) 如果需要加密的数字是7位,且理赔编码倒数第二位数字为奇数,按照第6,1,2,3,7,5,4的顺序取电话号码值进行重新组合;
b) 如果需要加密的数字是7位,且理赔编码倒数第二位数字为偶数,按照第4,5,7,3,2,1,6的顺序取电话号码值进行重新组合;
c) 如果需要加密的数字是8位,且理赔编码倒数第二位数字为奇数,按照第6,1,2,8,3,7,5,4的顺序取电话号码值进行重新组合;
d) 如果需要加密的数字是8位,且理赔编码倒数第二位数字为偶数,按照第4,5,7,3,8,2,1,6的顺序取电话号码值进行重新组合;

  1.  从理赔编码中选取后八位作为系数,与打乱顺序后电话号码数字依次对应求和取个位数作为加密后的数字。
db2 "CREATE OR REPLACE FUNCTION transPhoneNo (REPORTPHONENO varchar(20),CLAIMQUERYNO VARCHAR(50))
RETURNS VARCHAR(50)
BEGIN
--========================================
--定义变量
--加密电话号码
DECLARE v_iphone varchar(20);
--需要进行加密的数字
DECLARE afterSub VARCHAR(20);
--不需要进行加密的数字
DECLARE noTrans VARCHAR(20);
--加密后的电话号码
DECLARE result VARCHAR(20);
--是否是手机号码
DECLARE isMobilPhone int;

--理赔编码取余
DECLARE csqNod2 int;
--电话号码
DECLARE afterSub1 varchar(10);
DECLARE afterSub2 varchar(10);
DECLARE afterSub3 varchar(10);
DECLARE afterSub4 varchar(10);
DECLARE afterSub5 varchar(10);
DECLARE afterSub6 varchar(10);
DECLARE afterSub7 varchar(10);
DECLARE afterSub8 varchar(10);
--理赔编码
DECLARE csqNo1 varchar(10);
DECLARE csqNo2 varchar(10);
DECLARE csqNo3 varchar(10);
DECLARE csqNo4 varchar(10);
DECLARE csqNo5 varchar(10);
DECLARE csqNo6 varchar(10);
DECLARE csqNo7 varchar(10);
DECLARE csqNo8 varchar(10);



--==========================================
--非空校验
if (REPORTPHONENO is null or CLAIMQUERYNO is null) then 
return REPORTPHONENO;
end if;
--判断电话号码大于20,返回入参电话号码
if(length(REPORTPHONENO)>20) then 
return REPORTPHONENO;
end if;

--bug1
--判断理赔编码是否为30位
if (length(CLAIMQUERYNO)<>30) then 
return REPORTPHONENO;
end if;

--判断加密电话号码必须全为数字
if (length(REPORTPHONENO)=12) and (ltrim(rtrim(translate(REPORTPHONENO,'','0123456789')))<>'-') then
return REPORTPHONENO;
elseif (length(REPORTPHONENO)=11) and (ltrim(rtrim(translate(REPORTPHONENO,'','0123456789')))<>'') then
return REPORTPHONENO;
end if;


--=======================================
--座机处理方式
--包含'-'
if (LOCATE('-',REPORTPHONENO)=4) or (LOCATE('-',REPORTPHONENO)=5) then
--判断电话号码是否为纯数字(固话只包含‘-’)
    set afterSub=substr(REPORTPHONENO,locate('-',REPORTPHONENO)+1,(length(REPORTPHONENO)-locate('-',REPORTPHONENO)));
    set noTrans=substr(REPORTPHONENO,1,locate('-',REPORTPHONENO));
    set csqNod2=mod((Integer(trim(char(left(right(CLAIMQUERYNO,2),1))))),2);
--座机号加密处理
--afterSub长度为7
    if (length(afterSub)=7) then 

      set noTrans=substr(REPORTPHONENO,1,locate('-',REPORTPHONENO))||'-';
      set afterSub1=substr(afterSub,1,1);
	  set afterSub2=substr(afterSub,2,1);
      set afterSub3=substr(afterSub,3,1);
      set afterSub4=substr(afterSub,4,1);
      set afterSub5=substr(afterSub,5,1);
      set afterSub6=substr(afterSub,6,1);
      set afterSub7=substr(afterSub,7,1);
--bug2
      set csqNo1=substr(CLAIMQUERYNO,23,1);      
      set csqNo2=substr(CLAIMQUERYNO,24,1);
      set csqNo3=substr(CLAIMQUERYNO,25,1);
      set csqNo4=substr(CLAIMQUERYNO,26,1);
      set csqNo5=substr(CLAIMQUERYNO,27,1);
      set csqNo6=substr(CLAIMQUERYNO,28,1);
      set csqNo7=substr(CLAIMQUERYNO,29,1);
      set csqNo8=substr(CLAIMQUERYNO,30,1);
      
      if (csqNod2=1) then
      --倒2位为奇数
      --6,1,2,3,7,5,4
      set afterSub6=afterSub6+csqNo1;
      if (afterSub6>=10) then
         set afterSub6=afterSub6-10;
       end if;
       
      set afterSub1=afterSub1+csqNo2;
      if (afterSub1>=10) then
         set afterSub1=afterSub1-10;
       end if;
       
      set afterSub2=afterSub2+csqNo3;
      if (afterSub2>=10) then
         set afterSub2=afterSub2-10;
       end if;
       
      set afterSub3=afterSub3+csqNo4;
      if (afterSub3>=10) then
         set afterSub3=afterSub3-10;
       end if; 
       
      set afterSub7=afterSub7+csqNo5;
      if (afterSub7>=10) then
         set afterSub7=afterSub7-10;
       end if;
      
      set afterSub5=afterSub5+csqNo6;
      if (afterSub5>=10) then
         set afterSub5=afterSub5-10;
       end if;
       
      set afterSub4=afterSub4+csqNo7;
      if (afterSub4>=10) then
         set afterSub4=afterSub4-10;
       end if;

           
         set v_iphone=noTrans||afterSub6||afterSub1||afterSub2||afterSub3||afterSub7||afterSub5||afterSub4;
         return v_iphone;
       --倒2位为偶数
        elseif(csqNod2=0) then
           --4,5,7,3,2,1,6
      set afterSub4=afterSub4+csqNo1;
      if (afterSub4>=10) then
         set afterSub4=afterSub4-10;
       end if;
       
      set afterSub5=afterSub5+csqNo2;
      if (afterSub5>=10) then
         set afterSub5=afterSub5-10;
       end if;
       
      set afterSub7=afterSub7+csqNo3;
      if (afterSub7>=10) then
         set afterSub7=afterSub7-10;
       end if;
       
      set afterSub3=afterSub3+csqNo4;
      if (afterSub3>=10) then
         set afterSub3=afterSub3-10;
       end if; 
       
      set afterSub2=afterSub2+csqNo5;
      if (afterSub2>=10) then
         set afterSub2=afterSub2-10;
       end if;
      
      set afterSub1=afterSub1+csqNo6;
      if (afterSub1>=10) then
         set afterSub1=afterSub1-10;
       end if;
       
      set afterSub6=afterSub6+csqNo7;
      if (afterSub6>=10) then
         set afterSub6=afterSub6-10;
       end if;
           set v_iphone=noTrans||afterSub4||afterSub5||afterSub7||afterSub3||afterSub2||afterSub1||afterSub6;
           return v_iphone;
        end if;
--afterSub长度为8
      elseif(length(afterSub)=8) then 
          set noTrans=substr(REPORTPHONENO,1,locate('-',REPORTPHONENO))||'-';
    	    set afterSub1=substr(afterSub,1,1);
    	    set afterSub2=substr(afterSub,2,1);
          set afterSub3=substr(afterSub,3,1);
          set afterSub4=substr(afterSub,4,1);
          set afterSub5=substr(afterSub,5,1);
          set afterSub6=substr(afterSub,6,1);
          set afterSub7=substr(afterSub,7,1);
          set afterSub7=substr(afterSub,7,1);
          set afterSub8=substr(afterSub,8,1);
          set csqNo1=substr(CLAIMQUERYNO,23,1);
          set csqNo2=substr(CLAIMQUERYNO,24,1);
          set csqNo3=substr(CLAIMQUERYNO,25,1);
          set csqNo4=substr(CLAIMQUERYNO,26,1);
          set csqNo5=substr(CLAIMQUERYNO,27,1);
          set csqNo6=substr(CLAIMQUERYNO,28,1);
          set csqNo7=substr(CLAIMQUERYNO,29,1);
          set csqNo8=substr(CLAIMQUERYNO,30,1);
      --倒2位为奇数
      if (csqNod2=1) then
      --6,1,2,8,3,7,5,4   
      set afterSub6=afterSub6+csqNo1;
      if (afterSub6>=10) then
         set afterSub6=afterSub6-10;
       end if;
       
      set afterSub1=afterSub1+csqNo2;
      if (afterSub1>=10) then
         set afterSub1=afterSub1-10;
       end if;
       
      set afterSub2=afterSub2+csqNo3;
      if (afterSub2>=10) then
         set afterSub2=afterSub2-10;
       end if;
       
      set afterSub8=afterSub8+csqNo4;
      if (afterSub8>=10) then
         set afterSub8=afterSub8-10;
       end if; 
       
      set afterSub3=afterSub3+csqNo5;
      if (afterSub3>=10) then
         set afterSub3=afterSub3-10;
       end if;
      
      set afterSub7=afterSub7+csqNo6;
      if (afterSub7>=10) then
         set afterSub7=afterSub7-10;
       end if;
       
      set afterSub5=afterSub5+csqNo7;
      if (afterSub5>=10) then
         set afterSub5=afterSub5-10;
       end if;
       
      set afterSub4=afterSub4+csqNo8;
      if (afterSub4>=10) then
          set afterSub4=afterSub4-10;
       end if;

            set v_iphone=noTrans||afterSub6||afterSub1||afterSub2||afterSub8||afterSub3||afterSub7||afterSub5||afterSub4;
            return v_iphone;
          --倒2位为偶数
          elseif(csqNod2=0) then
             --4,5,7,3,8,2,1,6
     	set afterSub4=afterSub4+csqNo1;
     	if (afterSub4>=10) then
     	   set afterSub4=afterSub4-10;
     	 end if;
     	 
     	set afterSub5=afterSub5+csqNo2;
     	if (afterSub5>=10) then
     	   set afterSub5=afterSub5-10;
     	 end if;
     	 
     	set afterSub7=afterSub7+csqNo3;
     	if (afterSub7>=10) then
     	   set afterSub7=afterSub7-10;
     	 end if;
     	 
     	set afterSub3=afterSub3+csqNo4;
     	if (afterSub3>=10) then
     	   set afterSub3=afterSub3-10;
     	 end if; 
     	 
     	set afterSub8=afterSub8+csqNo5;
     	if (afterSub8>=10) then
     	   set afterSub8=afterSub8-10;
     	 end if;
     	
     	set afterSub2=afterSub2+csqNo6;
     	if (afterSub2>=10) then
     	   set afterSub2=afterSub2-10;
     	 end if;
     	 
     	set afterSub1=afterSub1+csqNo7;
     	if (afterSub1>=10) then
     	   set afterSub1=afterSub1-10;
     	 end if;
     	 
     	set afterSub6=afterSub6+csqNo8;
     	if (afterSub6>=10) then
     	    set afterSub6=afterSub6-10;
     	 end if;
             set v_iphone=noTrans||afterSub4||afterSub5||afterSub7||afterSub3||afterSub8||afterSub2||afterSub1||afterSub6;
             return v_iphone;
          end if;
              
  else
   return REPORTPHONENO;
  end if;

--不包含'-'
--手机号处理方式
else
   if (length(REPORTPHONENO)=11) then 
      set afterSub=substr(REPORTPHONENO,4);
	    set noTrans=substr(REPORTPHONENO,1,3)||'-';
	    set csqNod2=mod((Integer(trim(char(left(right(CLAIMQUERYNO,2),1))))),2);
--手机号加密处理
          set noTrans=substr(REPORTPHONENO,1,3)||'-';
    	  set afterSub1=substr(afterSub,1,1);
    	  set afterSub2=substr(afterSub,2,1);
          set afterSub3=substr(afterSub,3,1);
          set afterSub4=substr(afterSub,4,1);
          set afterSub5=substr(afterSub,5,1);
          set afterSub6=substr(afterSub,6,1);
          set afterSub7=substr(afterSub,7,1);
          set afterSub7=substr(afterSub,7,1);
          set afterSub8=substr(afterSub,8,1);
          set csqNo1=substr(CLAIMQUERYNO,23,1);
          set csqNo2=substr(CLAIMQUERYNO,24,1);
          set csqNo3=substr(CLAIMQUERYNO,25,1);
          set csqNo4=substr(CLAIMQUERYNO,26,1);
          set csqNo5=substr(CLAIMQUERYNO,27,1);
          set csqNo6=substr(CLAIMQUERYNO,28,1);
          set csqNo7=substr(CLAIMQUERYNO,29,1);
          set csqNo8=substr(CLAIMQUERYNO,30,1);
          
          
      --理赔编码倒2为奇数
       if (csqNod2=1) then
       --6,1,2,8,3,7,5,4
      set afterSub6=afterSub6+csqNo1;
      if (afterSub6>=10) then
         set afterSub6=afterSub6-10;
       end if;
       
      set afterSub1=afterSub1+csqNo2;
      if (afterSub1>=10) then
         set afterSub1=afterSub1-10;
       end if;
       
      set afterSub2=afterSub2+csqNo3;
      if (afterSub2>=10) then
         set afterSub2=afterSub2-10;
       end if;
       
      set afterSub8=afterSub8+csqNo4;
      if (afterSub8>=10) then
         set afterSub8=afterSub8-10;
       end if; 
       
      set afterSub3=afterSub3+csqNo5;
      if (afterSub3>=10) then
         set afterSub3=afterSub3-10;
       end if;
      
      set afterSub7=afterSub7+csqNo6;
      if (afterSub7>=10) then
         set afterSub7=afterSub7-10;
       end if;
       
      set afterSub5=afterSub5+csqNo7;
      if (afterSub5>=10) then
         set afterSub5=afterSub5-10;
       end if;
       
      set afterSub4=afterSub4+csqNo8;
      if (afterSub4>=10) then
          set afterSub4=afterSub4-10;
       end if;
       
         set v_iphone=noTrans||afterSub6||afterSub1||afterSub2||afterSub8||'-'||afterSub3||afterSub7||afterSub5||afterSub4;
         return v_iphone;
       --理赔编码倒2为偶数
       elseif(csqNod2=0) then
       --bug3
       --4,5,7,3,8,2,1,6
       
      set afterSub4=afterSub4+csqNo1;
      if (afterSub4>=10) then
         set afterSub4=afterSub4-10;
       end if;
       
      set afterSub5=afterSub5+csqNo2;
      if (afterSub5>=10) then
         set afterSub5=afterSub5-10;
       end if;
       
      set afterSub7=afterSub7+csqNo3;
      if (afterSub7>=10) then
         set afterSub7=afterSub7-10;
       end if;
       
      set afterSub3=afterSub3+csqNo4;
      if (afterSub3>=10) then
         set afterSub3=afterSub3-10;
       end if; 
       
      set afterSub8=afterSub8+csqNo5;
      if (afterSub8>=10) then
         set afterSub8=afterSub8-10;
       end if;
      
      set afterSub2=afterSub2+csqNo6;
      if (afterSub2>=10) then
         set afterSub2=afterSub2-10;
       end if;
       
      set afterSub1=afterSub1+csqNo7;
      if (afterSub1>=10) then
         set afterSub1=afterSub1-10;
       end if;
       
      set afterSub6=afterSub6+csqNo8;
      if (afterSub6>=10) then
          set afterSub6=afterSub6-10;
       end if;
       
         set v_iphone=noTrans||afterSub4||afterSub5||afterSub7||afterSub3||'-'||afterSub8||afterSub2||afterSub1||afterSub6;
         return v_iphone;
       end if;
	 end if;
	end if;
end
"
   
db2 "values transPhoneNo('0315-7785643','50PAIC420018001544059319454105')"
db2 "values transPhoneNo('12222222222','50PAIC420018001544059319454105')"

猜你喜欢

转载自blog.csdn.net/M983373615/article/details/87285917