为什么加密和base64编码的文本在Windows和Linux上显得不同

时间:2014-03-05 17:34:04

标签: java database hibernate encryption

我有一个遗留系统,它使用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;}

2 个答案:

答案 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 );