web-dev-qa-db-ja.com

Bouncy Castleを使用したJasyptによるEncryptionOperationNotPossibleException

私は Jasypt とともに Bouncy Castle を使用して、Springアプリケーションで(128ビットAES)を提供し、エンティティのプロパティを復号化してHibernateで保存しようとします。しかし、私はいつもこれを取得しますorg.jasypt.exceptions.EncryptionOperationNotPossibleExceptionエンティティを保存しようとしたとき。

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:1073)
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.Java:924)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.Java:642)
at org.jasypt.hibernate4.type.AbstractEncryptedAsStringType.nullSafeSet(AbstractEncryptedAsStringType.Java:155)
at org.hibernate.type.CustomType.nullSafeSet(CustomType.Java:158)

(以下の完全なスタックトレース)

Java Cryptography Extension(JCE)を使用していません。そのため、私は Bouncy Castle を使用しようとしています。

スプリングの構成に問題があると思いますが、誰かが問題を見つけましたか?

私の春の構成は:

<bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>
<bean class="org.jasypt.hibernate4.encryptor.HibernatePBEStringEncryptor" depends-on="bouncyCastleProvider">

    <property name="provider" ref="bouncyCastleProvider"/>  
    <property name="providerName" value="BC"/>

    <property name="saltGenerator">
        <bean class="org.jasypt.salt.RandomSaltGenerator"/>
    </property>

    <property name="registeredName" value="STRING_ENCRYPTOR"/>      
    <property name="algorithm" value="PBEWITHSHA256AND128BITAES-CBC-BC"/>
    <property name="password" value="sEcRET1234"/>
</bean>

使用法:

@Entity
@TypeDef(name = "encryptedString", typeClass = EncryptedStringType.class, parameters = { @Parameter(name = "encryptorRegisteredName", value = "STRING_ENCRYPTOR") })
public class SubscriptionProcess {
  ...      
   @Type(type = "encryptedString")
   private String debitAccountIban;
  ...
}

pom/dependenies

    <dependency>
        <groupId>org.jasypt</groupId>
        <artifactId>jasypt</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.jasypt</groupId>
        <artifactId>jasypt-hibernate4</artifactId>
        <version>1.9.2</version>
    </dependency>
 ...
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <!-- I use an older version of bouncy castle that is also used by tika  -->
        <artifactId>bcprov-jdk15</artifactId>           
        <version>1.45</version>
    </dependency>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcmail-jdk15</artifactId>           
        <version>1.45</version>
    </dependency>

完全なスタックトレース

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:1073)
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.Java:924)
    at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.Java:642)
    at org.jasypt.hibernate4.type.AbstractEncryptedAsStringType.nullSafeSet(AbstractEncryptedAsStringType.Java:155)
    at org.hibernate.type.CustomType.nullSafeSet(CustomType.Java:158)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.Java:2843)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.Java:2818)
    at org.hibernate.persister.entity.AbstractEntityPersister$4.bindValues(AbstractEntityPersister.Java:3025)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.Java:57)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.Java:3032)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.Java:3556)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.Java:97)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.Java:480)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.Java:191)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.Java:175)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.Java:210)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.Java:324)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.Java:288)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.Java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.Java:125)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.Java:84)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.Java:206)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.Java:149)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.Java:75)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.Java:807)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.Java:780)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.Java:785)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.Java:1181)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.Java:291)
    at com.Sun.proxy.$Proxy78.persist(Unknown Source)
    at com.demo.base.user.BaseUserDomainCreatorUtil$Persistent.postCreate(BaseUserDomainCreatorUtil.Java:424)
    at com.demo.base.user.BaseUserDomainCreatorUtil.createSafeCustodyAccount(BaseUserDomainCreatorUtil.Java:321)
    at com.demo.base.user.BaseUserDomainCreatorUtil.createSafeCustodyAccount(BaseUserDomainCreatorUtil.Java:329)
    at com.demo.base.user.BaseUserDomainCreatorUtil.createSafeCustodyAccount(BaseUserDomainCreatorUtil.Java:333)
    at com.demo.base.user.BaseUserDomainCreatorUtil.createUserWithSafeCustodyAccount(BaseUserDomainCreatorUtil.Java:128)
    at com.demo.app.asset.AssetTestScenario.<init>(AssetTestScenario.Java:66)
    at com.demo.app.asset.dao.SubscriptionProcessDaoSpringTest.testPersistence_aroundBody0(SubscriptionProcessDaoSpringTest.Java:62)
    at com.demo.app.asset.dao.SubscriptionProcessDaoSpringTest$AjcClosure1.run(SubscriptionProcessDaoSpringTest.Java:1)
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:60)
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:66)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.Java:267)
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:64)
    at com.demo.app.asset.dao.SubscriptionProcessDaoSpringTest.testPersistence(SubscriptionProcessDaoSpringTest.Java:61)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.Java:73)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.Java:82)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.Java:73)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:271)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:217)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.Java:83)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.Java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.Java:68)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.Java:163)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
10
Ralph

Jasypt は、JCE providersで使用するように設計されています。このプロジェクトがWebで使用する用語は、次の文があるので混乱する可能性があります。

デフォルトのJava VM one。だけでなく、JCEプロバイダーで使用するためのオープンAPI。Jasyptは、Bouncy Castleなどのよく知られたプロバイダーで簡単に使用できます。

この文から、あなたはJasyptがJCEまたはBouncyCastleで使用できることを理解していると思います。ただし、この文が意味することは、デフォルトのJavaインストールとデフォルト以外のものが付属するJCE providers、デフォルトプロバイダーが多数あることですが、どちらも JCA/JCE仕様 を達成し、どちらもJasyptで動作します。

BouncyCastleがJCE providerを持っていると言ったように、 bouncycastle から、次のことがわかります。

Java Cryptography ExtensionおよびJava Cryptography Architecture。

したがって、プロバイダーとしてorg.bouncycastle.jce.provider.BouncyCastleProviderを使用して暗号化/復号化操作を行おうとしている場合、使用可能なアルゴリズムとキーの長さに関して、すべてのJCEプロバイダーと同じ制限があります。

鍵の長さとアルゴリズムに関するこの制限を回避し、発生したエラーを渡すには、JVMバージョンにJava Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Filesをインストールする必要があります。

たとえば、Java 1.7の場合、ファイルは here からダウンロードできます。次に、jarを$ Java_HOME\jre\lib\securityにコピーして、既存のlocal_policy.jarおよびUS_export_policy.jarを上書きします。

お役に立てれば。

24
albciff