繁体   English   中英

为什么在Windows和Linux上加密和以base64编码的文本看起来有所不同

[英]Why encrypted and base64 encoded text appears different on Windows and Linux

我有一个旧系统,该系统使用休眠拦截器对某些数据库表上的某些字段进行加密(编码)和解密(解码)。 它利用OnSave,OnLoad和OnFlushDirty方法。 由于从该系统读取的数据转移到另一个应用程序时,仍然会对某些记录进行加密和编码(有些加密多次),因此该代码是有缺陷的。 对我来说,这里的挑战是,当接收应用程序在Windows计算机上时,我可以执行解密和解码(必要时进行多次)。 当接收应用程序是linux VM时,我尝试重复同样的事情时,出现BadPaddingException。

任何帮助/建议将不胜感激

这是休眠拦截器的一小段

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;}

我不得不在这里猜测,但是如果您是说这个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!

如果控制双方,则进行编码和解码,这是使用DatatypeConverter的更好方法:

String          buffer          = DatatypeConverter.printBase64Binary( symKey );
byte[]          supposedSymKey  = DatatypeConverter.parseBase64Binary( buffer );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM