InvalidKeyException Недопустимый размер ключа
У меня есть тест, который отлично работает на моей разработке MacBook Pro, но не запускается при непрерывной интеграции с сервером TeamCity.
Ошибка следующая:
java.security.InvalidKeyException: Illegal key size
at javax.crypto.Cipher.a(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
at javax.crypto.Cipher.init(DashoA13*..)
И блок разработки, и TeamCity используют Java 1.6, а я использую библиотеку BouncyCastle для необходимости специального шифрования AES.
Код следующий:
private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
Security.addProvider(new BouncyCastleProvider());
SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
return cipher.doFinal(info.getBytes("UTF-8"));
}
ОБНОВИТЬ
Похоже, в соответствии с выбранным ответом мне нужно что-то изменить в своей установке TeamCity, и это, возможно, повлияет на некоторые пользовательские установки - так что это не лучший выбор, я должен переключиться на другую криптографическую библиотеку, чтобы сделать это без ограничений. Так что наверное надувной замок поможет.
ОБНОВЛЕНИЕ 2
Я фактически перешел на использование BouncyCastle, чтобы избежать этого ограничения. Обратите внимание, что это работает, только если вы используете собственные классы BC напрямую, а не поставщик BC.
6 ответов
Эта ошибка означает, что ваша виртуальная машина Java использует политику, которая разрешает только ограниченные размеры ключей криптографии из-за законов США об экспорте.
Java 9 и выше
Файлы политики неограниченной юрисдикции включены в Java 9 и используются по умолчанию (см. Обновления безопасности в Руководстве по миграции на Java 9).
Если вы получите эту ошибку с Java 9, это может означать, что конфигурация политики была изменена на более строгую политику (limited
), см. инструкции из руководства по миграции:
Файл политики юрисдикции JCE по умолчанию не ограничен
Если вашему приложению ранее требовались файлы политик юрисдикции неограниченного расширения Java Cryptography Extension (JCE), вам больше не нужно загружать или устанавливать их. Они включены в JDK и активированы по умолчанию.
Если ваша страна или использование требует более строгой политики, файлы криптографической политики с ограниченным доступом Java все еще доступны.
Если у вас есть требования, которые не выполняются ни одним из файлов политики, предоставленных по умолчанию, вы можете настроить эти файлы политики в соответствии со своими потребностями.
Увидеть
crypto.policy
Охранное имущество в<java-home>/conf/security/java.security
файл, или Конфигурация криптографической стойкости в платформе Java, Standard Edition Security Developer's Guide.
Java 8 и ранее
Java 8 обновление 161 и выше
Начиная с Java 8 Update 161, Java 8 по умолчанию использует Политику неограниченной юрисдикции. Если вы получите эту ошибку, это может означать, что конфигурация была изменена на limited
, См. Инструкции в следующем разделе по Java 8 Update 151 или в предыдущем разделе по Java 9, чтобы изменить его обратно на unlimited
,
Java 8 Обновление 151 и выше
Начиная с Java 8 Update 151, политика неограниченной юрисдикции включена в Java 8, но по умолчанию не используется. Чтобы включить его, вам нужно отредактировать java.security
файл в <java_home>/jre/lib/security
(для JDK) или <java_home>/lib/security
(для JRE). Раскомментируйте (или включите) строку
crypto.policy=unlimited
Обязательно отредактируйте файл, используя редактор, запущенный от имени администратора.
Изменение политики вступает в силу только после перезапуска JVM (это особенно важно для долго выполняющихся серверных процессов, таких как Tomcat).
Для обеспечения обратной совместимости установка файлов политики, как описано в следующем разделе, также будет работать.
До Java 8 Обновление 151
Для Java 8 с обновлением 144 и более ранних версий необходимо установить файлы политики неограниченной юрисдикции расширения криптографии Java (JCE) (доступны в Oracle).
Чтобы установить эти файлы (из README.txt
в загрузке):
Загрузите файлы политики JCE неограниченной силы.
Распакуйте и распакуйте загруженный файл.
Это создаст подкаталог с именем jce. Этот каталог содержит следующие файлы:
README.txt This file local_policy.jar Unlimited strength local policy file US_export_policy.jar Unlimited strength US export policy file
Установите файлы JAR политики неограниченной силы.
Если впоследствии вы решите вернуться к исходным "сильным", но ограниченным версиям политики, сначала сделайте копию исходных файлов политики JCE (US_export_policy.jar и local_policy.jar). Затем замените файлы строгой политики неограниченными версиями надежности, извлеченными на предыдущем шаге.
Стандартное место для файлов JAR политики юрисдикции JCE:
<java-home>/lib/security [Unix] <java-home>\lib\security [Windows]
Примечание для JDK находится в jre/lib/security.
Новый файл политики вступает в силу только после перезапуска JVM (это особенно важно для долго работающих серверных процессов, таких как Tomcat).
У меня была похожая проблема, но в моем случае произошла ошибка пути.
JAVA_HOME был jdk1.6.0_18, поэтому я поместил две банки в jdk1.6.0_18/lib/security
, но в jdk1.6.0_18 есть jre
каталог. Оба файла должны были быть помещены в jdk1.6.0_18/jre/lib/security
,
В дополнение к установке файлов политики, также убедитесь, что CUSTOMLONGSECRETKEY...getBytes()
действительно производит массив 32 байта. я хотел бы использовать CUSTOMLONGSECRETKEY.getBytes(some encoding)
и получить первые 32 байта от этого. А еще лучше, используйте целый секретный ключ, чтобы получить ключи для AES нужного вам размера.
Я столкнулся с той же проблемой для jdk 1.8.0_151-
Для этой и выше версий вам не нужно загружать файлы jar, относящиеся к security.Because local_policy.jar и US_export_policy.jar уже включены в эти версии по пути- \jre\lib\security\policy (JAVA_HOME относится к текущая папка установки Java). Единственное, что вам нужно сделать, это файл java.security, который находится в /jre/lib/security - раскомментируйте строку -crypto.policy = unlimited
Принятый ответ предполагает, что у вас есть права администратора на изменение файлов и папок в качестве администратора.
Если это не так, для Java 8 Update 151 и выше вы можете сделать следующее:
- Создайте локальный файл с одной строкой
crypto.policy=unlimited
. - Добавлять
-Djava.security.properties=<yourfile>
к вашей команде Java, где<yourfile>
это локальный файл, который вы создали
Этот метод должен работать, еслиsecurity.overridePropertiesFile
явно отключен (включен по умолчанию).
Ссылка:<java_home>/jre/lib/security/java.security
#
# This is the "master security properties file".
#
# An alternate java.security properties file may be specified
# from the command line via the system property
#
# -Djava.security.properties=<URL>
#
# This properties file appends to the master security properties file.
# If both properties files specify values for the same key, the value
# from the command-line properties file is selected, as it is the last
# one loaded.
#
# Also, if you specify
#
# -Djava.security.properties==<URL> (2 equals),
#
# then that properties file completely overrides the master security
# properties file.
#
# To disable the ability to specify an additional properties file from
# the command line, set the key security.overridePropertiesFile
# to false in the master security properties file. It is set to true
# by default.
...
Убедитесь, что вы знаете путь к JAVA_HOME, который использует ваша IDE. Для того, чтобы скопировать на правильный путь.
В моем случае я использую IntelliJ: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security
Вместо того, когда я показываю $JAVA_HOME в консоли. /Users/myuser/.sdkman/candidates/java/current/jre/lib/security