2011-05-25 48 views
9

我正在使用Jasypt加密庫來加密/解密一些文本。此代碼嵌入WAR文件並部署到服務器。org.jasypt.exceptions.EncryptionOperationNotPossibleException在Tomcat中

在本地運行時,在單元測試中,加密/解密週期完美工作。我使用Jetty開發應用程序。該代碼在該服務器上完美工作。出於某種原因,部署到Tomcat會破壞它,但有以下例外:

僅供參考,我的本地和服務器環境都安裝了強大的加密庫,我使用的是最新的1.6版本(修補程序級別25)。

org.jasypt.exceptions.EncryptionOperationNotPossibleException

異常沒有消息。

該代碼是完全對稱的。我把它粘貼在這裏進行審查。這裏是相關的位:

我發現一個old Nabble post用戶有一個非常類似的問題。代碼在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); 
    } 
} 
+1

我想確認 - 是它與該異常失敗的解密操作?如果是這樣,你是否已經簽出[在StackOverflow這個問題](http://stackoverflow.com/questions/4905281/miffed-simple-code-but-org-jasypt-exceptions-encryptionoperationnotpossib)? – 2011-05-25 03:29:01

+0

這是來自jayst文檔的令人敬畏的評論:它旨在提供錯誤原因的很少的信息(如果有的話),以便通過錯誤消息不會顯示加密內部信息。 – 2011-05-25 12:21:45

+0

好的,我解決了這個問題。我在Base64encoding之後將加密的字符串放在URL上,然後對該字符串進行URL編碼。在我的環境中,這工作得很好。在我的服務器上,我在Apache前端Tomcat的位置,這不起作用。我在Jasypt FAQ中找到了答案。我從Base64編碼更改爲十六進制編碼。這固定了它。我猜測Apache可能在傳遞給Tomcat之前更改了原始查詢字符串。 – Erik 2011-05-25 12:56:17

回答

1

我面臨類似的問題。 對我來說,這是因爲它試圖解密一個無法使用解密機制解密的密碼。

因此,I 在解密方法試圖解密密碼之前將密碼加密並將其存儲在數據庫中。

我希望它可以幫助別人。

2

@biniam_Ethiopia
我會評論你的答案,但我沒有足夠的聲譽,所以我寫我自己的答案:

我有一個非常類似的問題,但對我來說,那是因爲更改加密的算法(PBEWithMD5AndTripleDES),而db中的條目在之前保存有另一個(PBEWithMD5AndDES)。 所以我也得到了一個EncryptionOperationNotPossibleException,因爲@Nathan Feger的評論上面沒有提供信息。

我希望這可以幫助別人一天太;)