Безопасность 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 is:
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
Примечания:
* ява.безопасность на сервере 1.6.0.12 каталог java почти полностью совпадает с 1.6.0.26 java.файл безопасности. Нет никаких дополнительных провайдеры в первом из них.
* Предыдущий вопрос здесь.
16 ответов:
скорее всего, у вас нет установленного сейчас файла unlimited strength.
возможно, Вам потребуется загрузить этот файл:
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Скачать
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Скачать
извлеките файлы jar из zip и сохраните их в
${java.home}/jre/lib/security/.
файлы юрисдикции JRE/JDK/Java 8 можно найти здесь:
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download
Как сказал Джеймс выше:
Установите файлы в${java.home}/jre/lib/security/.
для JAVA 7 ссылка на скачивание jce-7-Скачать
скопируйте две загруженные банки в Java\jdk1.7. 0_10\jre\lib\security
Делайте резервную копию старых банок, чтобы быть на безопасной стороне.для JAVA 8 ссылка на скачивание jce-8-Скачать
Скопируйте загруженные банки в Java\jdk1.8. 0_45\jre\lib\security
Делайте резервную копию старых банок, чтобы быть на безопасной стороне.
С Java 9, Java 8u161,Java 7u171 и Java 6u181 ограничение теперь отключено по умолчанию. Смотрите проблема в базе данных ошибок Java.
начиная с Java 8u151 вы можете отключить ограничение программно.
в более старых версиях файлы юрисдикции JCE должны были быть загружены и установлены отдельно, чтобы позволить неограниченной криптографии использоваться JDK. Этот загрузка и установка шагов больше не требуется.
вместо этого теперь вы можете вызвать следующую строку перед первым использованием классов JCE (т. е. предпочтительно сразу после запуска приложения):
Security.setProperty("crypto.policy", "unlimited");
Это код единственным решением. Нет необходимости загружать или возиться с файлами конфигурации.
это решение на основе отражения,протестировано на 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
"Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6"
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
в Java по умолчанию AES поддерживает 128-битный ключ, если вы планируете использовать 192-битный или 256-битный ключ, Java complier выдаст исключение незаконного размера ключа, которое вы получаете.
решение, как Виктор и Джеймс предложил, вам нужно будет загрузить JCE (Java Cryptography Extension) в соответствии с вашей версией JRE, (java6, java7 или java8).
почтовый индекс JCE содержит следующее Фляги:
- local_policy.банку
- US_export_policy.банку
вы должны заменить эти банки образуют ваш
<JAVA_HOME>/jre/lib/security. если вы находитесь в системе unix, вероятно, будет ссылаться на/home/urs/usr/lib/jvm/java-<version>-oracle/иногда просто заменяя local_policy.jar, US_export_policy.jar в папке безопасности не работает в unix, поэтому я предлагаю сначала скопировать папку безопасности на рабочий стол, заменить папку @Desktop/security jar, удалить папку безопасности из /jre / lib/ & переместить папку безопасности рабочего стола в /jre/lib/.
например:: sudo MV security
/usr/lib/jvm/java-7-oracle/jre/lib
я испытал ту же ошибку при использовании 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Загрузите и извлеките файлы, содержащиеся в на этот архив в эту папку.
проблема контент файл default_local.политика на local_policy.банку в папке 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.
есть краткое обсуждение того, что кажется этой проблемой здесь. Страница это ссылки - видимому, ушли, но один из ответов может быть то, что вам нужно:
действительно, копирование US_export_policy.jar и local_policy.фляги из ядра в/lib/око до $переменной JAVA_HOME/JRE и/lib/безопасности помогли. Спасибо.
Я также получил проблему, но после замены существующего на загруженный (из JCE) один решил проблему. Новые крипто файлы обеспечили неограниченную силу.
по умолчанию Java поддерживает только AES 128 бит (16 байт) размеры ключей для шифрования. Если вам не нужно больше, чем по умолчанию поддерживается, вы можете обрезать ключ до нужного размера перед использованием
Cipher. Смотрите документация для ключей, поддерживаемых по умолчанию.это пример создания ключа, который будет работать с любой версией 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); }
по умолчанию JDK поддерживает шифрование только через 128-битные ключи из-за американских ограничений. Поэтому для поддержки шифрования с 256-битным длинным ключом мы должны заменить
local_policy.jarиUS_export_policy.jarsin$JAVA_HOME/java-8-oracle/jre/lib/securityпапка в противном случае он даст:java.безопасность.InvalidKeyException: недопустимый размер ключа или значение по умолчанию
обе банки и подробную концепцию можно понять по ссылке:
начиная с Java 9 или 8u151, вы можете использовать комментарий строки в файле:
<JAVA_HOME>/jre/lib/security/java.securityи
#crypto.policy=unlimitedдо
crypto.policy=unlimited
если вы используете дистрибутив Linux с apt и добавили webupd8 PPA, вы можете просто запустить команду
apt-get install oracle-java8-unlimited-jce-policy
другие обновления:
- файлы политики юрисдикции неограниченной силы включены в Java 9 и используется по умолчанию
- начиная с Java 8 Обновление 161, Java 8 по умолчанию использует политику юрисдикции неограниченной силы.
начиная с Java 8 Update 151, политика юрисдикции неограниченной силы включена в Java 8, но не используется по умолчанию. Чтобы включить его, вам нужно отредактировать java.файл безопасности в
<java_home>/jre/lib/security(для JDK) или<java_home>/lib/security(для JRE). Раскомментируйте (или включите) строку
crypto.policy=unlimitedубедитесь, что вы редактируете файл с помощью редактора Запуск от имени администратора. Изменение политики вступает в силу только после перезапуска JVM
до Обновление Java 8 151 остальные ответы остаются действительными. Скачать око неограниченной силой файлах политики юрисдикции и заменить.
Как установить Java Cryptography Extension (JCE) unlimited strength jurisdiction policy files
есть два варианта решения этой проблемы
Вариант № 1 : используйте сертификат с меньшей длиной RSA 2048
вариант № 2 : вы обновите две банки в
jre\lib\securityвсе, что вы используете java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.htmlили вы используете IBM websphere или любой сервер приложений, использующий его java . основная проблема, с которой я столкнулся я использовал сертификацию с максимальной длиной, когда я развернул уши на websphere такое же исключение выбрасывается
Java Security: Illegal key size or default parameters?я обновил папку java intsalled в 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
Comments