开发大佬早上给我了一个任务,在用kettle抽取某张表的数据的时候,要对里面的某个字段进行加密。要求是用AES加密,我首先搜了一下,发现了一个大佬的Base64的加密算法,这里记一下用Base64和AES方法的加密。
方法一:Base64加解密
首先摆上自己的完整的过程图:
这里是java代码中主要的操作,消息步骤是数据来源的步骤,目标步骤是数据输出的步骤
加解密代码如下:
import java.util.Base64;
import java.util.*;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
if (first) {
first = false;
}
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
r = createOutputRow(r, data.outputRowMeta.size());
//加密
String foobar1 = get(Fields.In, "NAME").getString(r);
byte[] bytes = foobar1.getBytes();
String encoded = Base64.getEncoder().encodeToString(bytes);
get(Fields.Out, "NAME").setValue(r, encoded);
//String foobar2 = get(Fields.In, "IC_CARD").getString(r);
//byte[] bytes2 = foobar2.getBytes();
//String encoded1 = Base64.getEncoder().encodeToString(bytes2);
//get(Fields.Out, "IC_CARD").setValue(r, encoded1);
//解密(加密解密我是分了两张表,加密的内容在表一,解密的内容是从把表一的内动解密到表二,所以这样写解密的代码)
//String foobar1 = get(Fields.In, "NAME").getString(r);
//byte[] decoded = Base64.getDecoder().decode(foobar1);
//String decodeStr = new String(decoded);
//get(Fields.Out, "NAME").setValue(r, decodeStr);
//String foobar2 = get(Fields.In, "IC_CARD").getString(r);
//byte[] decoded2 = Base64.getDecoder().decode(foobar2);
//String decodeStr2 = new String(decoded2);
//get(Fields.Out, "IC_CARD").setValue(r, decodeStr2);
putRow(data.outputRowMeta, r);
return true;
}
方法二:AES加密
使用了方法一以后,大佬说要用AES加密,然后kettle中有个加密的组件,组件中有AES加密算法,就使用该组件
完整的图如下:
对称加密组件的使用方法:
其中的密钥要在mysql中生成。
生成密钥的sql为:select hex(‘1234567890adbcde’)
这是插入/更新中的字段的声明