Бинарный файл Python OSX (версия 2) находится в /usr/bin/python
, если вы используете which python
, он скажет вам, к какому решению разрешена команда python
. Как правило, происходит то, что третьи стороны переопределяют вещи в /usr/local/bin
(что имеет преимущество, по умолчанию по /usr/bin
). Чтобы исправить, вы можете либо запустить /usr/bin/python
напрямую, чтобы использовать 2.x, либо найти ошибочное переопределение (вероятно, в /usr/local/bin
или где-то еще в вашем PATH
)
Если вы используете Linux, вы можете легко проверить эту команду с помощью этой команды
java -version ; \
echo 'System.err.println(javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding").getMaxAllowedKeyLength("AES"));' \
| java -cp /usr/share/java/bsh-*.jar bsh.Interpreter >/dev/null
Если вывод похож на этот, криптография с неограниченной силой недоступна
java version "1.7.0_76"
Java(TM) SE Runtime Environment (build 1.7.0_76-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode)
128
Это полная версия пасты для копирования, позволяющая тестировать
import javax.crypto.Cipher;
import java.security.NoSuchAlgorithmException;
class Test {
public static void main(String[] args) {
int allowedKeyLength = 0;
try {
allowedKeyLength = Cipher.getMaxAllowedKeyLength("AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
System.out.println("The allowed key length for AES is: " + allowedKeyLength);
}
}
Для запуска
javac Test.java
java Test
Если JCE не работает: 128
JCE работает примерно так: 2147483647
ПРИМЕЧАНИЕ. Пожалуйста, используйте ответ jefflunt или ответ КонстантинаСпирова . Этот ответ не является допустимым ответом, так как он всегда будет возвращать true
. Я оставляю этот ответ здесь только потому, что он упоминается в другом месте в ответах и комментариях и полезен только в качестве ссылки.
Вы можете использовать следующее для инициализации static final boolean
где-нибудь, использовать для тестирования неограниченной криптовальной поддержки (поскольку 256-разрядный AES поддерживается только в случае установки неограниченной политики).
boolean isUnlimitedSupported = false;
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES", "SunJCE");
kgen.init(256);
isUnlimitedSupported = true;
} catch (NoSuchAlgorithmException e) {
isUnlimitedSupported = false;
} catch (NoSuchProviderException e) {
isUnlimitedSupported = false;
}
System.out.println("isUnlimitedSupported=" + isUnlimitedSupported);
// set static final variable = isUnlimitedSupported;
Cipher
проверяет допустимые размеры ключей, а KeyGenerator
- нет. Ограничения не являются специфическими для провайдера. Кроме того, создание экземпляра KeyGenerator
не является очень эффективным или логичным методом проверки ограничений. Удалите неверные ответы.
– Maarten Bodewes
21 November 2015 в 23:23
В том же духе, что и ответ Дэн Круз, но с одной строкой кода и без исключений:
boolean limit = Cipher.getMaxAllowedKeyLength("RC5")<256;
Таким образом, полная программа может быть:
import javax.crypto.Cipher;
public class TestUCE {
public static void main(String args[]) throws Exception {
boolean unlimited =
Cipher.getMaxAllowedKeyLength("RC5") >= 256;
System.out.println("Unlimited cryptography enabled: " + unlimited);
}
}
"RC5"
, довольно неясный потоковый шифр, который не входит в список требуемых алгоритмов i>, он проверяет 256 (которые могут быть доступны в будущих ограниченных JRE, а также не отлично справляйтесь с этим исключением. Обратите внимание на мой ответ , который разрешает это.
– Maarten Bodewes
21 November 2015 в 23:27
Если вы находитесь в Linux, и вы установили JDK (но Beanshell недоступен), вы можете проверить с помощью команды runscript
, поставляемой с JDK.
jrunscript -e 'exit (javax.crypto.Cipher.getMaxAllowedKeyLength("RC5") >= 256 ? 0 : 1);'; echo $?
Это возвращает значение 0
, если доступна неограниченная криптография, или 1
, если она недоступна. Zero - это правильное возвращаемое значение «success» для функций оболочки, а ненулевое значение указывает на сбой.
rpm -ql jdk | grep jrunscript
, чтобы найти ее.
– slm
20 January 2016 в 04:40
Способ проверки того, применяются ли ограничения, задокументирован в методе Cipher.getMaxAllowedKeyLength
:
Если установлены файлы политики ограниченной юрисдикции JCE,
blockquote>Integer.MAX_VALUE
будет возвращен.Это означает, что если возвращается какое-либо значение, отличное от (или даже более низкое)
Integer.MAX_VALUE
, которые применяются ограничения.Еще больше информации в JavaDoc метода ниже:
/** * Determines if cryptography restrictions apply. * Restrictions apply if the value of {@link Cipher#getMaxAllowedKeyLength(String)} returns a value smaller than {@link Integer#MAX_VALUE} if there are any restrictions according to the JavaDoc of the method. * This method is used with the transform <code>"AES/CBC/PKCS5Padding"</code> as this is an often used algorithm that is <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#impl">an implementation requirement for Java SE</a>. * * @return <code>true</code> if restrictions apply, <code>false</code> otherwise */ public static boolean restrictedCryptography() { try { return Cipher.getMaxAllowedKeyLength("AES/CBC/PKCS5Padding") < Integer.MAX_VALUE; } catch (final NoSuchAlgorithmException e) { throw new IllegalStateException("The transform \"AES/CBC/PKCS5Padding\" is not available (the availability of this algorithm is mandatory for Java SE implementations)", e); } }
Обратите внимание, что с Java 9 по умолчанию установлены неограниченные криптополитические политики (с теми, на которые влияют правила импорта / экспорта, которые должны установить ограниченные криптографические политики ). Таким образом, этот код будет в основном требоваться для обратной совместимости и / или другого времени выполнения.
getMaxAllowedKeyLength("foo")
и получить правильный ответ. Я обнаружил, что до тех пор, пока аргумент не null
или ""
, вы получите ответ, который вы ищете.
– Christopher Schultz
3 March 2016 в 16:57
Недавно мне пришлось добавить проверку JCE, и мое решение эволюционировало до следующего фрагмента. Это был отличный скрипт, но его легко преобразовать в стандартный Java-метод с помощью try catch. Это было протестировано с помощью Java 7 & amp; Java 8.
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.SecretKey;
// Make a blank 256 Bit AES Key
final SecretKey secretKey = new SecretKeySpec(new byte[32], "AES");
final Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// This line will throw a invalid key length exception if you don't have
// JCE Unlimited strength installed
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey);
// If it makes it here, you have JCE installed
Вы можете проверить это за один шаг из командной строки с помощью groovy:
groovysh -e 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'
Если результат 2147483647
, у вас есть неограниченная криптография.
На старших версии groovy, вы должны удалить -e
:
groovysh 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'