Jasypt 暗号化ライブラリを使用して、一部のテキストを暗号化/復号化しています。このコードは WAR ファイルに埋め込まれ、サーバーにデプロイされます。
ローカルで実行している場合、および単体テストでは、暗号化/復号化サイクルは完全に機能します。アプリケーションの開発には Jetty を使用しています。コードはそのサーバーで完全に機能します。何らかの理由で、Tomcat にデプロイすると、次の例外が発生します。
参考までに、ローカル環境とサーバー環境の両方に強力な暗号化ライブラリをインストールしており、最新の 1.6 バージョン (パッチ レベル 25) を使用しています。
org.jasypt.exceptions.EncryptionOperationNotPossibleException
例外にはメッセージがありません。
コードは完全に対称です。検証用にここに貼り付けました。関連するビットは次のとおりです。
ユーザーが非常によく似た問題を抱えていた古い 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);
}
}