之前写了个aes 加密和解密的算法,本来在windows调试一直没有出现问题,部署到Linux确报错:
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975) ~[na:na]
at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056) ~[na:na]
at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853) ~[na:na]
at java.base/com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446) ~[na:na]
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2208) ~[na:na]
at cn.com.ups.common.utils.EncryptionUtil.aesDecrypt(EncryptionUtil.java:93) ~[classes!/:0.0.1-SNAPSHOT]
at cn.com.ups.common.utils.EncryptionUtil.aesDecrypt(EncryptionUtil.java:102) ~[classes!/:0.0.1-SNAPSHOT]
原因分析
那么为什么在Windows正常,在Linux就出现异常呢?
SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。
关于SecureRandom类的详细介绍,见 http://yangzb.iteye.com/blog/325264
解决办法
修改调用getInstance方法
替换:new SecureRandom(encryptKey.getBytes())为:
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG") ;
secureRandom.setSeed(encryptKey.getBytes());