我们都知道在使用加密解密的时候都需要密匙,但是密匙随便定义个可以吗,今天我就遇到这个坑,加密解密用的都是同一个密匙,在本地测试一切正常,然而部署到服务器的时候就亮了,解密的时候报了下面的错误,经查阅资料,原来是因为windows跟Linux的系统不同导致的,随便定义的密匙串是不行的
javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2164)
at com.ccb.operation.common.utils.AESUtil.decrypt(AESUtil.java:72)
at com.ccb.mall.module.client.details.ation.ExceldetailAction.executeEx(ExceldetailAction.java:193)
那么该如何生成的通用的密匙串呢,下面提供一个工具类
//生成密匙的方法
public static String getSecretKey() {
String keyStr = null;
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
Key key = new SecretKeySpec(keyBytes, "AES");
keyStr = Base64.getEncoder().encodeToString(key.getEncoded());
} catch (Exception var5) {
var5.printStackTrace();
}
return keyStr;
}
执行的结果如下,比如说生成这个GYBh3Rmey7nNzR/NpV0vAw==,就可以把这个密匙串当做常量,加密解密都用这个密匙串就可以了
加密方法:
public static String encode(String key, String text) {
String result = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(1, new SecretKeySpec(Base64.getDecoder().decode(key), "AES"));
byte[] encodeResult = cipher.doFinal(text.getBytes());
result = Hex.encodeHexString(encodeResult);
} catch (Exception var5) {
var5.printStackTrace();
}
return result;
}
解密方法:
public static String decode(String key, String text) {
String result = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(2, new SecretKeySpec(Base64.getDecoder().decode(key), "AES"));
byte[] decodeResult = cipher.doFinal(Hex.decodeHex(text));
result = new String(decodeResult);
} catch (Exception var5) {
var5.printStackTrace();
}
return result;
}
测试效果
这样无论在windows还是Linux都可以正常进行解密了
总结:密匙串不能随便写个,必须得用系统生成的串