InvalidKeyException Недопустимый размер ключа - PullRequest
57 голосов
/ 05 октября 2010

У меня есть тест, который отлично работает на моей разработке 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.

Ответы [ 5 ]

123 голосов
/ 05 октября 2010

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

Java 9 и выше

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

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

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

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

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

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

См. crypto.policy Свойство безопасности в <java-home>/conf/security/java.security файл или Конфигурация криптостойкости в платформе Java, Standard Edition Security Developer Guide.

Java 8 и более ранние

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

Начиная с Java 8, обновление 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).

8 голосов
/ 29 мая 2013

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

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

1 голос
/ 05 октября 2010

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

0 голосов
/ 05 апреля 2018

Я столкнулся с той же проблемой для 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

0 голосов
/ 06 октября 2017

Убедитесь, что вы знаете путь к 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

...