AS400 - DB2 for i的加密、解密
前言
因为项目要求,需要加密DB2的数据,加密后的数据同步到其他数据库,也能在其他数据库解密
最终通过创建UDF调用Java包获得解决。
一、DB2自带的加密和函数(无法在非DB2中使用)
DB2 for i 自带3个加密函数(点击是IBM文档):
ENCRYPT_AES
ENCRYPT_RC2
ENCRYPT_TDES
参数3个:(1)待加密字符串,(2)密钥,(3)提示语
加密后的是不可读的二进制数据。
解密(点击是文档):
DECRYPT_CHAR
参数2个:密文,密钥
问题:同步到其他平台后,也无法通过公共加密算法解密。因为不了解DB2的加密算法细节,无法非DB2外解密,查询文档、其他论坛均无果,包括咨询了IBM的技术支持。
二、创建UDF,调用JAVA程序解密和加密
1.编写加密、解密Java代码(包括Base64编码)
省略了加密逻辑,网上搜索一堆,有几个细节注意下:
- AS400 V7R3M0版本,带的Java版本是1.7.0,没有java.util.Base64,所以用sun.misc.的。
- 编码后的Base64会自动换行,所以要去除换行符(replaceAll("[\s*\t\n\r]", “”))
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
public class Encryption {
public static String AesEncryption(String inputText) {
try {
byte[] encrypted = cipher.doFinal(plainText);
return new BASE64Encoder().encode(encrypted).replaceAll("[\\s*\t\n\r]", ""); // 转为Base64,因为Base64每76字符换行,所以这里要删掉换行符
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public static String AesDecryption(String data){
try {
byte[] original = cipher.doFinal(encrypted1);
return new String(original);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
2.UDF调用的Java程序要求
[IBM文档-Java user-defined scalar functions](https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rzaha/writeudf.htm)概括几点:
- UDF调用的方法一定要public static方法
- 方法参数的类型和方法返回值的类型都要和DB2的类型匹配(IBM文档)
- 其他见IBM文档
3.编译Java程序
PDF文档如下
IBM Redbook
参考内容:
5.3.1 Compilation of Java code
5.3.2 Where to place Java classes
概括几点:
- 编译可以在自己电脑编译,也可以在AS400上编译
- 如果在自己电脑编译,留意使用Java的版本要和AS400的一致
- 编译后的class文件需要放在 /QIBM/UserData/OS400/SQLLib/Function中
4.创建DB2 UDF
PDF文档如下 [IBM Redbook](https://www.redbooks.ibm.com/redbooks/pdfs/sg248326.pdf) 参考内容: 11.2 Registering an external UDF概括几点:
- 可以使用Navigator图形化界面创建UDF,很方便
- 如果用图形化界面创建不够逼格,可以直接写SQL代码,具体也是参考IBM的Redbook
总结
创建完UDF后,即可在SQL中使用了,但我一定要先执行CHGJOB CCSID(1388),才能正常使用,否则会报以下错误:The external program or service program returned SQLSTATE 57017。
本文介绍了如何在AS400上利用DB2自带的加密函数以及创建UDF调用Java程序实现数据加密解密。由于DB2自带函数无法在非DB2环境中解密,作者通过编写Java代码并编译为UDF,成功实现了在不同平台间的加密数据同步与解密。关键步骤包括编写Java加密解密代码、满足UDF调用要求、编译Java程序及创建DB2 UDF。
1601

被折叠的 条评论
为什么被折叠?



