Java - AES 256可在JDK 7和JDK 9中运行,但不能在JDK 8中运行
问题描述:
我使用新的JDK 9发行版编写了此类。Java - AES 256可在JDK 7和JDK 9中运行,但不能在JDK 8中运行
public class Encrypters {
public static byte[] AESEncrypt(Key key, byte[] data) throws GeneralSecurityException {
Cipher cipher=Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedData=cipher.doFinal(data);
return encryptedData;
}
}
我也写了这个辅助类
public class Hashes {
public static byte[] sha256Hash(byte[] input) {
return hash(input, "SHA-256");
}
private static byte[] hash(byte[] input, String algorithm) {
MessageDigest md=null;
try {
md=MessageDigest.getInstance(algorithm);
}
catch (NoSuchAlgorithmException e) {}
return md.digest(input);
}
}
这是使用加密的字符串:
String password=...;
String data=...;
Key key=new SecretKeySpec(Hashes.sha256Hash(password.getBytes(), "AES"));
Encrypters.AESEncrypt(key, data.getBytes());
此代码与JDK 9和JDK 7上同时运行,但与JDK 8. 如果我尝试使用JDK 8运行,则出现此错误:
java.security.InvalidKeyException: Illegal key size or default parameters
为什么我得到这个错误? Java 8不支持AES-256?
答
它是支持的,你只需要更新Java 8 JRE(link),或包括JCE策略文件(link) 的强加密从未被默认包含在JRE中,它是最新的分布。在你的情况下,它适用于Java 7的原因可能是因为它是7u171或更高版本。请参阅 JDK-8170157了解有关何时将其回溯到不同版本的详细信息。
它可能不相关,但您应该始终定义密码的所有方面。不要只使用“AES”。你也不应该使用ECB模式。改为使用“AES/CBC/PKCS5Padding”。 –