web-dev-qa-db-ja.com

Tomcatのorg.jasypt.exceptions.EncryptionOperationNotPossibleException

Jasypt暗号化ライブラリを使用してテキストを暗号化/復号化します。このコードはWARファイルに埋め込まれ、サーバーにデプロイされます。

ローカルで実行する場合、および単体テストでは、暗号化/復号化サイクルは完全に機能します。 Jettyを使用してアプリケーションを開発しています。コードはそのサーバーで完全に機能します。何らかの理由で、Tomcatにデプロイすると、次の例外を除いて、Tomcatが機能しなくなります。

参考までに、ローカル環境とサーバー環境の両方に強力な暗号化ライブラリをインストールしており、最新の1.6バージョン(パッチレベル25)を使用しています。

org.jasypt.exceptions.EncryptionOperationNotPossibleException

例外にはメッセージがありません。

コードは完全に対称的です。検査のためにここに貼り付けました。関連するビットは次のとおりです。

私は1つを見つけました 古いNabble投稿 ユーザーが非常によく似た問題を抱えていました。コードはTomcat内を除いてどこでも機能しました。解決策はありませんでした。

どんな洞察も大歓迎です。

**更新:**ローカルシステムのTomcatで実行すると、機能しているようです。だから私のサーバーについて何かがあります。サーバーでは、Windows Server 2008で64ビットJVMを使用しています。ローカルで32ビットJVMを使用しています(システムが少し古いため)。これは問題と関係があるのだろうか。

public void initializeService() {
    binaryEncryptor = new BasicBinaryEncryptor();
    binaryEncryptor.setPassword(keyBase64);
}

@Override
public <T extends Serializable> String simpleEncrypt(T objectToEncrypt) throws EncryptionException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(objectToEncrypt);

        byte[] bytes = binaryEncryptor.encrypt(bos.toByteArray());
        return new String(Base64.encodeBase64(bytes));
    } catch (IOException e) {
        LOGGER.error("failed to encrypt String: " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    } catch (Exception e) {
        LOGGER.error("failed to encrypt String: " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    }
};

@SuppressWarnings("unchecked")
@Override
public <T> T simpleDecrypt(String objectToDecrypt) throws EncryptionException {
    try {
        byte[] bytes = Base64.decodeBase64(objectToDecrypt);
        byte[] decryptedBytes = binaryEncryptor.decrypt(bytes);

        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(decryptedBytes));
        T object = (T)ois.readObject();
        return object;
    } catch (IOException e) {
        LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    } catch (Exception e) {
        LOGGER.error("failed to decrypt String: '" + objectToDecrypt + "', mesage = " + e.getMessage());
        throw new EncryptionException(e.getMessage(), e);
    }
}
10
Erik

ドキュメントへのリンクは次のとおりです。 http://www.jasypt.org/faq.html#i-keep-on-receiveing-encryption-operation-not-possible

  • 暗号化と復号化の構成は同じですか
  • テーブルの列が十分に大きいことを確認してください
  • Base64エンコードとurlencodingは競合する可能性があるため、適切に実行する必要があります。
5
Nathan Feger

@biniam_Ethiopia
私はあなたの答えにコメントしたでしょうが、私は十分な評判がないので、私は自分の答えを書きます:

非常によく似た問題がありましたが、私の場合は暗号化アルゴリズムを変更したため(PBEWithMD5AndTripleDES)、データベース内のエントリは以前は別のエントリで保存されていました(PBEWithMD5AndDES =)。そのため、EncryptionOperationNotPossibleExceptionも発生しました。これは、上記の@NathanFegerのコメントのために情報がありません。

これがいつか誰かにも役立つことを願っています;)

2
David Artmann

私も同様の問題に直面しました。私にとっては、復号化メカニズムを使用して復号化できなかったパスワードを復号化しようとしたためです。

したがって、I パスワードを暗号化してデータベースに保存復号化メソッドがパスワードを復号化しようとする前に。

私はそれが誰かを助けることを願っています。

1
biniam