Безопасность Java: недопустимый размер ключа или параметры по умолчанию? - PullRequest
385 голосов
/ 26 июня 2011

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

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

У меня 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 is: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

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

Ответы [ 18 ]

699 голосов
/ 26 июня 2011

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

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

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

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

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

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

50 голосов
/ 24 апреля 2014

Файлы юрисдикции JRE / JDK / Java 8 можно найти здесь:

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

Like Jamesсказал выше:
Установите файлы в ${java.home}/jre/lib/security/.

40 голосов
/ 09 января 2013

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

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

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

32 голосов
/ 21 октября 2017

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


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

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

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

Security.setProperty("crypto.policy", "unlimited");
29 голосов
/ 01 июня 2017

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

Это решение на основе отражения, протестировано на 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

16 голосов
/ 21 октября 2015

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

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

JCE zip содержит следующий JAR:

  1. local_policy.jar
  2. 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 в папке security не работает на unix, поэтому я предлагаю сначала скопировать папку security на рабочий стол, заменить папку jar @ Desktop / security, удалить папку security из / jre / lib / & переместите папку безопасности рабочего стола в /jre/lib/.

напр .: :: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib

16 голосов
/ 22 декабря 2011

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

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

15 голосов
/ 23 марта 2012

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

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

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

5 голосов
/ 25 сентября 2015

проблема в содержимом файла 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.

5 голосов
/ 26 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...