工作需要,在测试环境会有一张资料属性的表的一些字段需要脱敏,但是脱敏以后还会有想反向解析的需求。在简单的翻看一些资料后,决定使用oracle java 函数,为什么直接使用数据库函数呢,因为测试库权限开放的很大,直接被看到函数体就什么都漏了。
在编写java函数时,试了几种简单的算法,但平时简单易用的哪几种算法都会改变数据长度,比如AES,Blowfish等,但是这样就需要修改表结构,因为数据加密后很可能超过原始长度,所以最后选了个最土的办法,map映射,在了解数据格式的前提下,对数据做切分,然后写个javamap映射的程序,申明成oracle java函数,然后对需要脱敏的列使用就行了。
package test;
import java.util.*;
import java.util.regex.Pattern;
public class test_javamap{
public static String get_num(String input) {
Map<String, String> TEL_SEG = new HashMap<String, String>();
Map<String, String> TEL_NUM = new HashMap<String, String>();
//忽略了map的取值部分
String tel_string = input;
//System.out.println(tel_string);
String part_num = "";
String out_num = "";
//System.out.println(TEL_SEG.containsKey("136"));
//System.out.println(TEL_SEG.get("136"));
if(tel_string.substring(0,1).equals("g")){
if (TEL_SEG.containsKey(tel_string.substring(1,4))) {
out_num = "G" + TEL_SEG.get(tel_string.substring(1,4));
//System.out.println("in");
part_num = tel_string.substring(4);
for (int i=0;i<part_num.length();i++) {
out_num = out_num + TEL_NUM.get(part_num.charAt(i)+"");
}
}
}
else if (TEL_SEG.containsKey(tel_string.substring(0,3))) {
out_num = TEL_SEG.get(tel_string.substring(0,3));
part_num = tel_string.substring(3);
for (int i=0;i<part_num.length();i++) {
//System.out.println(part_num.charAt(i));
//System.out.println(TEL_NUM.get(part_num.charAt(i)+""));
out_num = out_num + TEL_NUM.get(part_num.charAt(i)+"");
}
}
else {
if(Pattern.matches("[a-zA-Z]",tel_string.substring(0,1))) {
out_num = tel_string.substring(0,1);
//System.out.println("in");
part_num = tel_string.substring(1);
for (int i=0;i<part_num.length();i++) {
out_num = out_num + TEL_NUM.get(part_num.charAt(i)+"");
}
}
else {
part_num = tel_string;
for (int i=0;i<part_num.length();i++) {
out_num = out_num +TEL_NUM.get(part_num.charAt(i)+"");
}
}
}
StringBuffer out_str = new StringBuffer(out_num);
out_str = out_str.reverse();
//System.out.println(out_str.reverse());
return out_str.toString();
}
public static void main(String[] args) {}
}