InvalidKeyException недопустимый размер ключа


у меня есть тест, который отлично работает на моем MacBook Pro разработки, но не может работать в непрерывной интеграции TeamCity server.

ошибка следующее:

java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

и development box, и 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.

5   51   2010-10-05 14:31:15

5 ответов:

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

Java 9 и выше

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

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

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

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

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

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

посмотреть crypto.policy свойства безопасности в , или Настройки Шифрования Силу в платформе Java , Стандартная версия безопасности разработчика Руководство.

Java 8 и ранее

Java 8 обновление 161 и выше

начиная с обновления 161 Java 8, Java 8 по умолчанию использует политику юрисдикции неограниченной силы. Если вы получаете эту ошибку, это может означать, что конфигурация была изменена на limited. См. инструкции в следующем разделе на Java 8 Update 151 или в предыдущем разделе на Java 9, чтобы изменить это обратно на unlimited.

обновление Java 8 151 и выше

начиная с обновления Java 8 151, политика юрисдикции неограниченной силы включена в Java 8, но не используется по умолчанию. Чтобы включить его, вам нужно отредактировать на <java_home>/jre/lib/security (для JDK) или <java_home>/lib/security (для JRE). Раскомментируйте (или включите) строку

crypto.policy=unlimited

убедитесь, что вы редактируете файл с помощью редактора Запуск от имени администратора.

изменение политики вступает в силу только после перезапуска JVM (это особенно важно для длительные серверные процессы, такие как Tomcat).

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

Перед Обновлением Java 8 151

для Java 8 обновление 144 и более ранних версий, необходимо установить Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files (доступно по адресу Оракул).

чтобы установить эти файлы (из 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 политики юрисдикции 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 находится

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

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

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

вместо того, когда я показываю $JAVA_HOME в консоли. / Пользователи / myuser/.sdkman / candidates / java / current/jre / lib / security

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

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