API политики шифрования FIPS [дубликат]

Бинарный файл Python OSX (версия 2) находится в /usr/bin/python

, если вы используете which python, он скажет вам, к какому решению разрешена команда python. Как правило, происходит то, что третьи стороны переопределяют вещи в /usr/local/bin (что имеет преимущество, по умолчанию по /usr/bin). Чтобы исправить, вы можете либо запустить /usr/bin/python напрямую, чтобы использовать 2.x, либо найти ошибочное переопределение (вероятно, в /usr/local/bin или где-то еще в вашем PATH)

41
задан Chi-Lan 31 October 2011 в 14:15
поделиться

9 ответов

24
ответ дан Peter O. 19 August 2018 в 06:16
поделиться

Если вы используете 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
2
ответ дан cklar 19 August 2018 в 06:16
поделиться

Это полная версия пасты для копирования, позволяющая тестировать

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

6
ответ дан code 19 August 2018 в 06:16
поделиться

ПРИМЕЧАНИЕ. Пожалуйста, используйте ответ 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;
0
ответ дан Dan Cruz 19 August 2018 в 06:16
поделиться
  • 1
    не работал для меня. оба случая, которые он дал. – Syam 12 June 2013 в 11:41
  • 2
    в самом деле. Это всегда будет возвращать true. Ответ должен быть удален. – eis 12 February 2015 в 15:10
  • 3
    @eis, я согласен. Это всегда будет возвращать true. Обновлено, чтобы отметить лучшие ответы. – Dan Cruz 12 February 2015 в 17:06
  • 4
    Это не работает, потому что 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);
  }
}
41
ответ дан eis 19 August 2018 в 06:16
поделиться
  • 1
    и это сработало, возвращая «false» и «true» соответственно. Спасибо. – eis 12 February 2015 в 14:44
  • 2
    Это лучший ответ, чем принятый ответ IMO. – Yazad Khambata 4 May 2015 в 17:45
  • 3
    Этот ответ использует преобразование "RC5", довольно неясный потоковый шифр, который не входит в список требуемых алгоритмов , он проверяет 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» для функций оболочки, а ненулевое значение указывает на сбой.

24
ответ дан Les Hazlewood 19 August 2018 в 06:16
поделиться
  • 1
    Просто FYI, что jrunscript включен в Oracle JDK, так что вам, возможно, придется искать его. В системе RedHat / CentOS / Fedora вы можете сделать rpm -ql jdk | grep jrunscript, чтобы найти ее. – slm 20 January 2016 в 04:40
  • 2
    Я пытаюсь запустить это в окнах. Есть ли специальный escape-символ, который мне нужно использовать? – user1207381 15 February 2017 в 22:03
  • 3
    Это работает как champ на macOS. Это также должно работать отлично под PowerShell. – Ryan J. McDonough 11 April 2017 в 01:45

Способ проверки того, применяются ли ограничения, задокументирован в методе Cipher.getMaxAllowedKeyLength :

Если установлены файлы политики ограниченной юрисдикции JCE, 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 по умолчанию установлены неограниченные криптополитические политики (с теми, на которые влияют правила импорта / экспорта, которые должны установить ограниченные криптографические политики ). Таким образом, этот код будет в основном требоваться для обратной совместимости и / или другого времени выполнения.

14
ответ дан Maarten Bodewes 19 August 2018 в 06:16
поделиться
  • 1
    Добавил этот дополнительный ответ, потому что принятый ответ не очень однозначен, а ответ , который в настоящее время имеет наибольшее количество голосов , использует RC5, довольно неясный потоковый шифр, которого нет в списке требуемые алгоритмы, он проверяет 256 (которые могут быть доступны в будущих ограниченных JRE), а также отлично справляется с этим исключением. – Maarten Bodewes 21 November 2015 в 23:20
  • 2
    Обратите внимание, что вы можете использовать getMaxAllowedKeyLength("foo") и получить правильный ответ. Я обнаружил, что до тех пор, пока аргумент не null или "", вы получите ответ, который вы ищете. – Christopher Schultz 3 March 2016 в 16:57
  • 3
    – Maarten Bodewes 3 March 2016 в 17:47

Недавно мне пришлось добавить проверку 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
-1
ответ дан Michael Fuller 19 August 2018 в 06:16
поделиться
  • 1
    Есть несколько проблем с вашей схемой. Прежде всего, он использует исключение во время выполнения кода для выполнения теста. Это затрудняет отладку. Возможно, существуют ограничения на будущее. RSA, которые не влияют на размер ключа AES, и в этом случае тест потерпит неудачу. В-третьих, для создания теста требуется создание ложных объектов, которые вообще не требуются. Тем не менее, тест, естественно, будет работать на Java 7 & amp; 8, и преобразование, которое вы выбрали, является, по крайней мере, обязательным для реализации Java SE. – Maarten Bodewes 22 November 2015 в 13:14

Вы можете проверить это за один шаг из командной строки с помощью groovy:

groovysh -e 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'

Если результат 2147483647, у вас есть неограниченная криптография.

На старших версии groovy, вы должны удалить -e:

groovysh 'javax.crypto.Cipher.getMaxAllowedKeyLength("AES")'
2
ответ дан Ortomala Lokni 19 August 2018 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: