我有一个遗留系统,它使用hibernate拦截器来加密(和编码)并解密(和解码)某些数据库表上的某些字段。它使用OnSave,OnLoad和OnFlushDirty方法。当从该系统读取数据时,该代码变成了错误,当转移到另一个应用程序时,仍然有一些记录被加密和编码(一些加密多次)。这里的挑战是,当接收应用程序在Windows机器上时,我可以执行解密和解码(根据需要多次)。当我尝试在接收应用程序是Linux VM时重复相同的事情时,我得到BadPaddingException。
非常感谢任何帮助/建议
这是一个hibernate拦截器的片段
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 :(得分:0)
我必须在这里猜测,但如果你的意思是Base64Coder,问题可能如下:
目前还不清楚base64字符串是如何创建的,即使用了哪种编码。 如果你使用UTF-8来获取字符串的字节并从这些字节创建一个base64,你会得到与你使用ISO Latin-1不同的结果。
然后使用UTF-8从这些字节创建一个字符串,但如果没有使用UTF-8创建base64字符串,则会得到错误的结果。
来自链接源的引用(如果这是正确的引用):
public static String encodeString (String s) {
return new String(encode(s.getBytes())); }
在这里,s.getBytes()
将使用系统的/ jvm的默认编码,因此您确实确保它是UTF-8!
答案 1 :(得分:0)
如果你控制双方,编码和解码,更好的方式来使用DatatypeConverter:
String buffer = DatatypeConverter.printBase64Binary( symKey );
byte[] supposedSymKey = DatatypeConverter.parseBase64Binary( buffer );