问题1
使用java的aes解密的时候出现了Given final block not properly padded的错误,如果你的数据不是用java自带的接口进行加密的密文,解密时可能出现这个问题,这是因为加解密除了算法外还有多种模式,比如ECB, CBC, CTR, CFB, OFB这些,其中最简单的是ecb,也叫做密码本,就是直接用秘钥套入算法,符合我们密码对密文的常规思维,速度快实现也简单,但这种方式密文里留了太多规律,容易遭到明文攻击,被反向破解,密级敏感或数据量大的时候最好别用,其他的几种模式更为安全,但是都需要附加额外的密码参数,使用更为复杂,java默认的aes加密提供的方式可能并不是ecb,如果你用ecb方式加密的数据,此时使用java默认的aes解密肯定会出错
说了这么多,怎么解决呢,很简单
Cipher cipher = Cipher.getInstance("AES");
替换为,指定ecb即可
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
我替换为了 AES/ECB/PKCS5Padding
private static final String AES_ALGORITHM= "AES/ECB/PKCS5Padding";
问题2
在某些Java环境中,默认的加密策略文件可能限制了加密算法可以使用的关键长度。这通常是出于出口限制的原因。
256位的AES密钥是AES算法支持的最大密钥长度,也是最为安全的选项。如果本地环境运行文件加解密没有问题,通常意味着本地的的JRE(Java运行时环境)已经包含了无限制的强度加密策略文件(Java Cryptography Extension - JCE)。
但是将应用程序部署到线上服务器时,可能会遇到以下几种情况:
- 服务器上的JRE没有安装无限制的JCE策略文件:如果服务器上的JRE没有安装无限制的JCE策略文件,那么将无法使用超过128位的AES密钥。要解决这个问题,需要下载并安装适用于您服务器上JRE版本的无限制强度JCE策略文件。
- 服务器环境的安全策略限制:某些服务器环境可能有额外的安全策略限制,可能阻止使用某些加密算法或密钥长度。
或者直接将密钥限制为128位
/** * 生成AES固定密钥 改 部署环境下AES密钥长度不能超过128位 * @return* @throwsException */
private static SecretKey generateAESKey() throws Exception {
byte[] keyBytes = FIXED_SECRET_KEY.getBytes(StandardCharsets.UTF_8);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] key = sha.digest(keyBytes); // 使用SHA-256哈希函数处理密钥SecretKeySpec secretKeySpec = new SecretKeySpec(key, 0, 16, "AES"); // 使用处理后的密钥字节创建SecretKeySpecreturn secretKeySpec;
}