2014-03-05 20 views
1

我有一個遺留系統使用hibernate攔截器對某些數據庫表上的某些字段進行加密(和編碼)和解密(以及解碼)。它使用OnSave,OnLoad和OnFlushDirty方法。這個代碼在從這個系統讀取數據時變成錯誤的,當傳送到另一個應用程序時仍然有一些記錄被加密和編碼(一些被加密了多次)。我面臨的挑戰是,當接收應用程序在Windows機器上時,我可以執行解密和解碼(儘可能多次)。當接收應用程序是一個linux虛擬機時,當我嘗試重複同樣的事情時,我得到一個BadPaddingException。爲什麼加密和base64編碼文本在Windows和Linux上顯示爲不同

任何幫助/建議將不勝感激

這裏是休眠攔截

public boolean onLoad(Object entity, Serializable arg1, Object[] state, String[] propertyNames, Type[] arg4) throws CallbackException { 
if (key != null){ 
try { 
    if (entity instanceof BasicData) { 
    for (int i = 0; i < state.length; i++) { 

    if (state[i] instanceof String){ 
     String cipherText = (String)state[i]; 
     byte[] cipherTextBytes = Base64Coder.decode(cipherText); 
     byte[] plainTextBytes = dCipher.doFinal(cipherTextBytes); 
     state[i] = new String(plainTextBytes, "UTF8"); 
    } 
} 
return true; 
} 
} catch (Exception e) { 
    e.printStackTrace(); 
}}return false;} 
+0

什麼是系統默認的編碼?什麼是'dCipher'? – Thomas

+0

可能是lineSeparator問題?因爲它對於Windows和Linux是不同的...... – Maxim

+0

這兩個系統都是UTF8 –

回答

0

我不得不在這裏猜測的一個片斷,但如果你的意思是這個Base64Coder問題可能是由於以下:

目前還不清楚base64字符串是如何被創建的,即哪個編碼已被使用。 如果您使用UTF-8獲取字符串的字節並從這些字節創建base64,則會得到與使用ISO Latin-1不同的結果。

然後,您使用UTF-8從這些字節創建一個字符串,但是如果base64字符串未使用UTF-8創建,則會得到錯誤的結果。

從鏈接源只是一個報價(如果這是正確的):

public static String encodeString (String s) { 
    return new String(encode(s.getBytes())); } 

這裏,s.getBytes()會使用系統的/ JVM的默認編碼,所以你應該真的確保它是UTF- 8!

0

如果控制雙方,編碼和解碼,更好的方式來使用DatatypeConverter:

String   buffer   = DatatypeConverter.printBase64Binary(symKey); 
byte[]   supposedSymKey = DatatypeConverter.parseBase64Binary(buffer); 
相關問題