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"));
}

UPDATE

Похоже, что в соответствии с выбранным ответом мне нужно что-то изменить в моей установке TeamCity, и это может повлиять на некоторые пользовательские установки - так что это не лучший выбор, я должен переключиться на другую библиотеку криптографии, чтобы сделать это без ограничений. Так что, вероятно, бодрый замок поможет.

ОБНОВЛЕНИЕ 2

Я фактически переключился на использование BouncyCastle, чтобы избежать этого ограничения. Обратите внимание, что это работает, только если вы используете собственные классы BC, а не поставщик BC.

Ответ 1

Эта ошибка означает, что ваша виртуальная машина Java использует политику, которая разрешает только ограниченные размеры ключей криптографии из-за законов США об экспорте.

Java 9 и выше

Файлы политики неограниченной юрисдикции включены в состав Java 9 и используются по умолчанию (см. Обновления безопасности в Руководстве по миграции на Java 9).

Если вы получите эту ошибку с Java 9, это может означать, что конфигурация политики была изменена на более ограничительную (limited), см. Инструкции из руководства по миграции:

Файл политики юрисдикции JCE по умолчанию не ограничен

Если вашему приложению ранее требовались файлы политики неограниченной силы расширения криптографии Java (JCE), вам больше не нужно загружать или устанавливать их. Они включены в JDK и активированы по умолчанию.

Если ваша страна или использование требует более строгой политики, файлы криптографической политики с ограниченным доступом Java все еще доступны.

Если у вас есть требования, которые не соответствуют ни одному из файлов политики, предоставленных по умолчанию, вы можете настроить эти файлы политики в соответствии со своими потребностями.

См. crypto.policy безопасности <java-home>/conf/security/java.security файле <java-home>/conf/security/java.security или Конфигурация криптографической <java-home>/conf/security/java.security в платформе Java, Standard Edition Security Developer 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 Update 144 и более ранних версий вам необходимо установить файлы политики неограниченной юрисдикции расширения криптографии Java (JCE) (доступны в Oracle).

Чтобы установить эти файлы (из файла README.txt в загрузке):

  1. Загрузите файлы политики JCE неограниченной силы.

  2. Распакуйте и распакуйте загруженный файл.

    Это создаст подкаталог с именем jce. Этот каталог содержит следующие файлы:

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
  3. Установите файлы 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).

Ответ 2

У меня была аналогичная проблема, но в моем случае была ошибка пути.

JAVA_HOME был jdk1.6.0_18, поэтому я помещал два баночки в jdk1.6.0_18/lib/security, но внутри jdk1.6.0_18 находится каталог jre. Оба файла должны быть помещены в jdk1.6.0_18/jre/lib/security.

Ответ 3

В дополнение к установке файлов политик также убедитесь, что CUSTOMLONGSECRETKEY...getBytes() действительно создает 32-байтовый массив. Я бы использовал CUSTOMLONGSECRETKEY.getBytes(some encoding) и получил первые 32 байта от этого. Еще лучше, используйте весь секретный ключ для получения ключей для AES с требуемым размером.

Ответ 4

Убедитесь, что вы знаете путь к JAVA_HOME, который использует ваша среда IDE. Чтобы скопировать правильный путь.

В моем случае я использую IntelliJ: /Library/Java/JavaVirtualMachines/jdk 1.8.0_112.jdk/Contents/Home/jre/lib/security

Вместо того, чтобы показывать $JAVA_HOME в консоли. /Users/myuser/.sdkman/candidates/java/current/jre/lib/security

Ответ 5

Я столкнулся с той же проблемой для jdk 1.8. 0_151-

Для этой и выше версий вам не нужно загружать файлы jar, относящиеся к security.Because local_policy.jar и US_export_policy.jar уже включены в эти версии в соответствии с path-\jre\lib\security\policy (относится к JAVA_HOME). в вашу текущую папку установки java) Единственное, что вам нужно сделать - это файл java.security, который находится в /jre/lib/security - раскомментируйте строку - crypto.policy = unlimited

Ответ 6

C:\Users\MPH2356293> java -version

Java-версия "1.8.0_152"

Java (TM) SE Runtime Environment (сборка 1.8.0_152-b16)

Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.152-b16, смешанный режим)

Это мои детали JDK может любой орган, пожалуйста, помогите мне, почему я все еще получаю

Ошибка при шифровании: java.security.InvalidKeyException: недопустимый размер ключа?