AS400 - DB2 for i的加密、解密

本文介绍了如何在AS400上利用DB2自带的加密函数以及创建UDF调用Java程序实现数据加密解密。由于DB2自带函数无法在非DB2环境中解密,作者通过编写Java代码并编译为UDF,成功实现了在不同平台间的加密数据同步与解密。关键步骤包括编写Java加密解密代码、满足UDF调用要求、编译Java程序及创建DB2 UDF。


前言

因为项目要求,需要加密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编码)

省略了加密逻辑,网上搜索一堆,有几个细节注意下:

  1. AS400 V7R3M0版本,带的Java版本是1.7.0,没有java.util.Base64,所以用sun.misc.的。
  2. 编码后的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)

概括几点:

  1. UDF调用的方法一定要public static方法
  2. 方法参数的类型和方法返回值的类型都要和DB2的类型匹配(IBM文档
  3. 其他见IBM文档

3.编译Java程序

PDF文档如下
IBM Redbook
参考内容:
5.3.1 Compilation of Java code
5.3.2 Where to place Java classes

概括几点:

  1. 编译可以在自己电脑编译,也可以在AS400上编译
  2. 如果在自己电脑编译,留意使用Java的版本要和AS400的一致
  3. 编译后的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

概括几点:

  1. 可以使用Navigator图形化界面创建UDF,很方便
  2. 如果用图形化界面创建不够逼格,可以直接写SQL代码,具体也是参考IBM的Redbook

总结

创建完UDF后,即可在SQL中使用了,但我一定要先执行CHGJOB CCSID(1388),才能正常使用,否则会报以下错误:The external program or service program returned SQLSTATE 57017。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值