Безопасность Java: недопустимый размер ключа или параметры по умолчанию?

Я задал вопрос об этом раньше, но он не получил правильного ответа и никуда не привел.

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

У меня есть Java 1.6.0.12, установленный на моем Linux-сервере, и приведенный ниже код работает отлично.

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}

Сегодня я установил Java 1.6.0.26 на пользователя моего сервера, и когда я пытаюсь запустить свое приложение, я получаю следующее исключение. Я предполагаю, что это связано с конфигурацией установки Java, поскольку она работает в первом, но не работает в более поздней версии.

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted

Строка 25: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Примечания:
* java.security на сервере 1.6.0.12 java-каталог почти полностью совпадает с файлом java.security 1.6.0.26. В первом нет дополнительных провайдеров.
* Предыдущий вопрос здесь.

Ответы

Ответ 1

Скорее всего, у вас сейчас не установлен файл неограниченной силы.

Вам может понадобиться скачать этот файл:

Файлы политик юрисдикции с неограниченной силой расширения Java Cryptography Extension (JCE) 6

Расширение Java Cryptography Extension (JCE) Файлы политики неограниченной юрисдикции 7 Загрузить

Расширение Java Cryptography Extension (JCE) Файлы политики неограниченной юрисдикции 8 Загрузка (требуется только для версий до Java 8 u162)

Извлеките файлы jar из zip и сохраните их в ${java.home}/jre/lib/security/.

Ответ 3

Для JAVA 7 ссылка для скачивания jce-7-download

Скопируйте два загруженных jars в Java\jdk1.7.0_10\jre\lib\security
Возьмите резервную копию старых банок, чтобы быть на более безопасной стороне.

Для JAVA 8 ссылка для скачивания jce-8-download
Скопируйте загруженные банки в Java\jdk1.8.0_45\jre\lib\security
Возьмите резервную копию старых банок, чтобы быть на более безопасной стороне.

Ответ 4

В Java 9, Java 8u161, Java 7u171 и Java 6u181 ограничение теперь отключено по умолчанию. Смотрите проблему в Java Bug Database.


Начиная с Java 8u151 вы можете программно отключить ограничение.

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

Вместо этого вы можете теперь вызвать следующую строку перед первым использованием классов JCE (т.е. предпочтительно сразу после запуска приложения):

Security.setProperty("crypto.policy", "unlimited");

Ответ 5

Это решение только для кода. Не нужно загружать или использовать файлы конфигурации.

Это решение на основе отражения, проверено на java 8

Вызов этого метода один раз, в начале вашей программы.

//Импорт

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

метод//

public static void fixKeyLength() {
    String errorString = "Failed manually overriding key-length permissions.";
    int newMaxKeyLength;
    try {
        if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
            Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
            Constructor con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissionCollection = con.newInstance();
            Field f = c.getDeclaredField("all_allowed");
            f.setAccessible(true);
            f.setBoolean(allPermissionCollection, true);

            c = Class.forName("javax.crypto.CryptoPermissions");
            con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissions = con.newInstance();
            f = c.getDeclaredField("perms");
            f.setAccessible(true);
            ((Map) f.get(allPermissions)).put("*", allPermissionCollection);

            c = Class.forName("javax.crypto.JceSecurityManager");
            f = c.getDeclaredField("defaultPolicy");
            f.setAccessible(true);
            Field mf = Field.class.getDeclaredField("modifiers");
            mf.setAccessible(true);
            mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            f.set(null, allPermissions);

            newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        }
    } catch (Exception e) {
        throw new RuntimeException(errorString, e);
    }
    if (newMaxKeyLength < 256)
        throw new RuntimeException(errorString); // hack failed
}

Кредиты: Delthas

Ответ 7

В Java по умолчанию AES поддерживает 128-битный ключ, если вы планируете использовать 192-битный или 256-битный ключ, java-complier выдает исключающее исключение размера ключа, которое вы получаете.

Решение как победитель и Джеймс предложил, вам нужно будет загрузить JCE (расширение криптографии Java) в соответствии с вашей версией JRE (java6, java7 или java8).

Почтовый индекс JCE содержит следующий JAR:

  • local_policy.jar
  • US_export_policy.jar

Вам нужно заменить эту банку на свой <JAVA_HOME>/jre/lib/security.  если вы находитесь в системе unix, вероятно, обратитесь к /home/urs/usr/lib/jvm/java-<version>-oracle/

Иногда просто заменяя local_policy.jar, US_export_policy.jar в папке безопасности не работает в unix, поэтому я предлагаю сначала скопировать папку безопасности на ваш рабочий стол, заменить папку jar @Desktop/security, удалить папку безопасности из/jre/lib/и переместите папку безопасности рабочего стола в /jre/lib/.

eg:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib

Ответ 8

Я испытал ту же ошибку при использовании Windows 7 x64, Eclipse и JDK 1.6.0_30. В папке установки JDK есть папка jre. Сначала это отбросило меня, так как я добавлял вышеупомянутые банки в папку lib/security JDK без везения. Полный путь:

C:\Program Files\Java\jdk1.6.0_30\jre\lib\security

Загрузите и извлеките файлы, содержащиеся в папке jce этого архива в эту папку.

Ответ 9

Здесь короткое обсуждение того, что, кажется, относится к этой проблеме здесь. На странице ссылки на, похоже, нет, но один из ответов может быть тем, что вам нужно:

Действительно, копирование US_export_policy.jar и local_policy.jar из ядра /lib/jce в $JAVA_HOME/jre/lib/security помогло. Спасибо.

Ответ 10

проблема заключается в содержании файла default_local.policy в local_policy.jar в папке jre\lib\security, если вы установите JRE:

// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.

grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128,
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128,
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};

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

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

вот что получается, если вы загрузите JCE из Oracle.

Ответ 11

У меня также возникла проблема, но после замены существующего на загруженный (из JCE) вопрос разрешил. Новые криптографические файлы предоставили неограниченную силу.

Ответ 12

По умолчанию Java поддерживает только размер ключей AES 128 бит (16 байтов) для шифрования. Если вам не нужно больше, чем по умолчанию, вы можете обрезать ключ до нужного размера, прежде чем использовать Cipher. См. javadoc для поддерживаемых по умолчанию ключей.

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

Вот хорошая статья о том, имеет ли ключевой размер от 128 до 256 ключей Блог AgileBits

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}

Ответ 13

Начиная с Java 9 или 8u151, вы можете использовать комментарий строки в файле:

<JAVA_HOME>/jre/lib/security/java.security

И изменить:

#crypto.policy=unlimited

в

crypto.policy=unlimited

Ответ 14

Если вы используете дистрибутив Linux с apt и добавили webupd8 PPA, вы можете просто запустить команду

apt-get install oracle-java8-unlimited-jce-policy

Другие обновления:

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

    crypto.policy=unlimited

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

До Java 8 Update 151 остальные ответы остаются в силе. Загрузите файлы политики неограниченной юрисдикции JCE и замените их.

Для получения более подробной информации вы можете обратиться к моему личному сообщению в блоге ниже - Как установить файлы политик неограниченной юрисдикции Java Cryptography Extension (JCE)

Ответ 15

JDK по умолчанию поддерживает шифрование только через 128-битные ключи из-за американских ограничений. Таким образом, для поддержки шифрования из ключа длиной 256 бит мы должны заменить local_policy.jar и US_export_policy.jars в US_export_policy.jars $JAVA_HOME/java-8-oracle/jre/lib/security иначе это даст:

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

И банку, и детальную концепцию можно понять по ссылке:

easybook4u.com

Ответ 16

Есть два варианта решения этой проблемы

Вариант № 1: использовать сертификат с меньшей длиной RSA 2048

Вариант № 2: вы будете обновлять два jar- jre\lib\security в jre\lib\security независимо от того, что вы используете java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

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

Java Security: Illegal key size or default parameters?

я обновил вложенную папку Java в Websphere двумя банками https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

Вы можете проверить ссылку в ссылке https://www-01.ibm.com/support/docview.wss?uid=swg21663373

Ответ 17

Вы должны пойти туда

/jdk1.8.0_152 |/JRE |/lib |/безопасность | java.security и раскомментируйте

#crypto.policy=unlimited

в

crypto.policy=unlimited

Ответ 18

Убедитесь, что вы используете последнюю версию JDK/JRE.

В моем случае я поместил JCE в папку JRE, но это не помогло. Это произошло потому, что я запускал свой проект из IDE напрямую (используя JDK).

Затем я обновил JDK и JRE до последней версии (1.8.0_211), и проблема исчезла.

Более подробная информация: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157

Ответ 19

Я исправлю это, просто понизив мою версию Java до Java 7, и она работает для меня