AS400 - DB2 for i的加密、解密

  • 前言
  • 一、DB2自带的加密和函数(无法在非DB2中使用)
  • 二、创建UDF,调用JAVA程序解密和加密
    • 1.编写加密、解密Java代码(包括Base64编码)
    • 2.UDF调用的Java程序要求
    • 3.编译Java程序
    • 4.创建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。

AS400 - DB2 for i的加密、解密相关推荐

  1. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  2. 提供一个基于.NET的加密/解密算法

    提供一个基于.NET SymmetricAlgorithm 类的.带私钥的加密/解密算法的包装类.使用方法: symmcrypto de = new SymmCrypto(SymmCrypto.Sym ...

  3. 加密解密php,PHP实现的加密解密处理类

    本文实例讲述了PHP实现的加密解密处理类.分享给大家供大家参考,具体如下: /*=========================================================== ...

  4. 加密解密-DES算法和RSA算法

    昨天忽然对加密解密有了兴趣,今天上班查找了一些资料,现在就整理一下吧:) 一.DES算法 这种算法如图所示,这里将描述它的每一个步骤.这个算法进行了16次迭代(圈),把各块明文交织起来与 从密钥中获得 ...

  5. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  6. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  7. 如何优雅的实现 Spring Boot 接口参数加密解密?

    点击关注公众号,Java干货及时送达 加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可以拿到一手的请求参数和 ...

  8. python实现加密字符串_Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.分享给大家供大家参考,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安 ...

  9. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

最新文章

  1. SAP QM初阶之物料主数据QM视图里的Preferred Inpspection Type
  2. 关于python使用cv画矩形并填充颜色同时填充文字
  3. 随机数生成算法-二谈
  4. html文件头自动生成,基于infinispan源码包HtmlGenerator代码生成器通过指定头部、标题、底部等进行生成HTML文件...
  5. BCD码与十进制的相互转换
  6. sps及pps在解码器内传递过程
  7. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·005【表的CRUD操作(DML语句)】
  8. jersery集成jackson实现restful api,由于jdk版本不一致导致的坑
  9. java.lang.ClassNotFoundException: org.jaxen.JaxenException 解决方法
  10. 已解决 | burp无法抓取iphone https数据包
  11. UDS tester之Tdrm
  12. 一次失败的鼠标修理经验
  13. 程序员公众号用什么工具写?
  14. 解读 | 计算机视觉已超越人类眼睛?
  15. KVR16N11S8/4-SP 内存是什么型号
  16. Oracle EBS使用adpatch工具打patch过程
  17. 币氪研报|OMG(OmiseGo)
  18. 基于javaweb+jsp的仓库进销存管理系统(JavaWeb MySQL JSP Bootstrap Servlet SSM SpringBoot)
  19. 8000 sentences of oral English(five)
  20. MySQL实战45讲笔记(三)

热门文章

  1. 为ThinkCentre M910t-NO76重装Windows7(64位)系统
  2. 黑客术语大全及其解释
  3. 记一次盖茨木马应急响应
  4. android休眠唤醒屏幕,Android屏幕的休眠和唤醒
  5. 如何在实验室服务器上跑代码
  6. SAP中MD04中交货计划行例外信息07的分析
  7. 分享个弹射世界挂机脚本 worldflipper 弹射世界挂机脚本 自动共斗踢罐子
  8. 电视盒子显示服务器未连接,你家的电视盒子直播总是卡,解决方法全都在这里...
  9. 打印机驱动下载,有哪些下载途径推荐?
  10. Kaggle时间序列(Time Series)教程 6-使用机器学习预测(forecasting-with-machine-learning)