2016-11-02 29 views
0

Я бы хотел использовать алгоритм PBEWITHHMACSHA256ANDAES_256 из SunJCE provider в Java8.Как использовать алгоритм PBEWITHHMACSHA256ANDAES_256 от JCE

Похоже, что банки и вся конфигурация находятся на месте из коробки в Java8, но я не могу использовать алгоритм PBEWITHHMACSHA256ANDAES_256.

У меня есть эти две банки:

jdk1.8.0_40\jre\lib\jce.jar 
jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar 

Там эта запись в jdk1.8.0_40\jre\lib\security\java.security

security.provider.5=com.sun.crypto.provider.SunJCE 

Там эта запись в jdk1.8.0_40\jre\lib\security\java.policy

grant codeBase "file:${{java.ext.dirs}}/*" { 
    permission java.security.AllPermission; 
}; 

Я могу видеть com.sun.crypto.provider.SunJCE в массиве, когда я звонок Security.getProviders()

Но следующий код генерирует EncryptionOperationNotPossibleException

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; 
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; 
import org.jasypt.exceptions.EncryptionOperationNotPossibleException; 
import org.junit.Assert; 
import org.junit.Test; 

public class EncryptionTest { 
    @Test 
    public void test() { 
     SimpleStringPBEConfig pbeConfig = new SimpleStringPBEConfig(); 
     pbeConfig.setAlgorithm("PBEWITHHMACSHA256ANDAES_256"); 
     pbeConfig.setPassword("changeme"); 
     StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); 
     encryptor.setConfig(pbeConfig); 

     String encrypted = encryptor.encrypt("foo"); 
     String decrypted = encryptor.decrypt(encrypted); 
     Assert.assertEquals("foo", decrypted); 
    } 
} 

Exception

org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine 
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:999) 
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:868) 
    at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:642) 
    at foo.bar.EncryptionTest.test(EncryptionTest.java:40) 

Любые идеи, почему PBEWITHHMACSHA256ANDAES_256 бросает EncryptionOperationNotPossibleException?

ответ

2

Исключение упоминает:

Шифрование вызывает исключение. Возможная причина вы используете сильные алгоритмы шифрования, и вы не установили Java Cryptography Extension (JCE) безграничную силу политики Юрисдикция файлов в этой виртуальной машины Java

Этот ответ только пытается исправить что вопрос. Я написал another answer, чтобы помочь решить следующую проблему, поскольку они совершенно разные.

Если вы живете в стране, которая разрешает это, вы можете пойти и скачать ее с Oracle's website.

Затем, чтобы установить эти пакеты с неограниченной крепостью, зайдите в свою папку $JAVA_HOME/jre/lib/security/ (при условии, что у вас есть JDK).

Там, сделайте резервную копию local_policy.jar и US_export_policy.jar.

Теперь распакуйте файлы local_policy.jar и US_export_policy.jar из файла ZIP, загруженного в эту папку, и перезапустите приложение. Теперь ваше приложение имеет доступ к неограниченным возможностям JCE.

Если что-то пойдет не так, верните два файла в свои резервные версии.

Обратите внимание: каждая JVM, которая должна будет запускать этот код, должна быть «исправлена» таким образом.

+0

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

+0

№ Это известное ограничение на экспортные правила Java из США. Вы должны рассмотреть это как дополнительный шаг установки Java и документировать его. Это действительно легко забыть. Вы можете облегчить это, предоставив скрипту и двум файлам jar каждому разработчику, чтобы они сделали это правильно. Но сначала убедитесь, что все они запускают JDK/JRE для Java 8 (например, запуская '$ JAVA_HOME/bin/java -version'). Если вы устанавливаете Java JDK или JRE, это сломает этот JDK. –

+0

Реальная альтернатива, хотя и заключается в том, чтобы реализовать алгоритм самостоятельно, с вашим собственным провайдером. Я бы настоятельно рекомендовал * против * его. В вашем профиле говорится, что вы живете в Великобритании, вы обычно имеете законный доступ к этому пакету и должны его использовать. –

1

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

Как вы говорите, вы «только» получаете пустое сообщение об исключении.

Проблема, похоже, связана с алгоритмом: использование PBEWITHHMACSHA256ANDAES_256 всегда вызывает исключение.

Это потому, что AES требует дополнительных параметров, а именно IV. Я обнаружил, что IV are not supported by Jasypt.

Если вы хотите пойти дальше с этим конкретным алгоритмом, я предлагаю вам выполнить его вручную без Jasypt. В приведенной выше ссылке присутствует реализация.