IBMJCE AND SunJCE(javax.crypto.BadPaddingException:Given final block not properly padded)

本文介绍了一种使用AES-256加密SFTP连接信息的方法,解决了因JCE提供程序不同导致的加密解密不一致的问题。通过指定统一的JCE提供者实现了跨平台的加密解密。
问题描述:

项目中要用到和SFTP进行连接上传文件,用户名密码IP什么的要配置在WAS服务器里面,出于安全性考虑,需要把这些连接的必要信息用AES-256进行加密,加密自己写了一个桌面工具,把加密过后的信息放到WAS配置文件里面,但是问题来了,在应用程序运行过程中,并没有成功的解密,报错如下:

javax.crypto.BadPaddingException:Given final block not properly padded






问题原因:

由于我桌面工具运行的时候是依赖的我本机的SUN的JDK, 他的JCE提供程序是SunJCE, 在WAS运行环境下,JDK是IBM提供的,JCE提供程序是IBMJCE, 两边的实现有差异,所以用SunJCE加密的东西再用IBEJCE解密就报错了。


解决办法:

我把WAS的runtime环境拷贝出来了,放在我桌面工具的目录下面,运行工具的时候,直接指定我的运行环境从IBM的JVM运行,这样就保证了加密过程也是通过IBMJCE走的。


start.bat 内容:

path = jre\bin;

java -cp lib\ur_jar_name.jar; theEntryMainClass   



IBM JCE(Java Cryptography Extension)是由 IBM 提供的 Java 加密服务提供者,支持多种加密算法和安全协议。其配置、使用及问题解决是开发人员在构建安全应用时需要重点关注的内容。 ### 配置 IBM JCE Provider IBM JCE provider 的配置通常涉及将其添加到 Java 安全环境中的提供者列表中。这可以通过修改 `java.security` 文件或动态注册实现。具体步骤如下: 1. **安装 IBM JCE Provider**:确保 IBM JCE 的 JAR 文件(例如 `ibmjceprovider.jar`)位于应用程序的类路径中。 2. **静态注册**:编辑 `$JAVA_HOME/lib/security/java.security` 文件,并将以下行添加到文件末尾: ```plaintext security.provider.N=com.ibm.crypto.provider.IBMJCE ``` 其中 `N` 是一个整数,表示提供者的优先级顺序。 3. **动态注册**:也可以通过编程方式在运行时添加提供者: ```java import java.security.Security; import com.ibm.crypto.provider.IBMJCE; public class Main { public static void main(String[] args) { Security.addProvider(new IBMJCE()); } } ``` ### 使用 IBM JCE Provider 一旦 IBM JCE provider 被正确配置,即可开始使用它提供的加密功能。以下是使用 IBM JCE 进行 AES 加密的示例代码: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Security; public class AesEncryptionExample { public static void main(String[] args) throws Exception { // 动态注册 IBM JCE Provider Security.addProvider(new com.ibm.crypto.provider.IBMJCE()); String plainText = "Hello, World!"; String key = "1234567890123456"; // 16 bytes for AES-128 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "IBMJCE"); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); // 加密模式 cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encrypted = cipher.doFinal(plainText.getBytes()); System.out.println("Encrypted: " + bytesToHex(encrypted)); } private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } } ``` ### 常见问题与解决方法 在使用 IBM JCE provider 时,可能会遇到一些常见问题。以下是一些典型问题及其解决方法: 1. **NoSuchProvider 异常**:如果抛出 `NoSuchProvider` 异常,则表明 IBM JCE provider 未被正确注册。请检查是否已将 `ibmjceprovider.jar` 添加到类路径,并确认是否已正确注册 provider。 2. **NoSuchAlgorithmException 异常**:如果抛出此异常,则可能是由于请求的加密算法不被支持。建议查阅 IBM JCE 文档以了解支持的算法列表[^1]。 3. **InvalidKeyException 异常**:此类异常通常发生在密钥格式或长度不符合要求时。请确保使用的密钥符合所选加密算法的要求。 ### 总结 IBM JCE 提供了丰富的加密功能,但在配置和使用过程中需要注意 provider 的正确注册以及对加密参数的合理设置。通过上述步骤和示例代码,可以更有效地集成和使用 IBM JCE provider 来满足安全需求。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值