解决方案 »

  1.   

    你这句
    String tmp = new String(hashedPasswordBytes,"GBK");
    明显就是逻辑上错误的代码,hashedPasswordBytes是经过SHA散列的结果,其类型是普通字节流,又不是GBK编码的文本,你怎么能够用GBK去解码?这样强行解码的结果就是产生很多乱码,并且更严重的后果是这些乱码实际上已经丢失的原有字节信息,比如一个字节 -120 ,解码后由于不存在对应的字符,因此这个解码器用空格代替,结果 -120 就变成了32(空格的ASCII码为32),当然这里只是举个例子,实际上解码器怎么解码这些“根本不能解码的数据”,不同的JDK版本可能有细小区别,所以就可能导致你说的JRE7和8结果不同。搞不懂当初为什么要写这种不但逻辑错误,而且毫无意义的代码。。
      

  2.   


    这个主要是以前老的逻辑代码,然后我们现在把JRE7 升级到JRE8,然后发现的问题。想找一个办法绕过去让它的老的数据也能够验证通过
      

  3.   

    我知道你想让JRE8兼容以前的老系统,但是我说了你这样去错误的解码产生的结果是不可预料不可复制的(当然理论上JRE7可以做的事JRE8一定也能做,但是你就需要去研究JRE7的解码模块是如何解码的,然后在JRE8中自己写个和JRE7一样的解码模块用)所以两个选择:
    1.放弃使用JRE8,或者至少这个模块需要在JRE7环境中编译运行
    2.将系统全部重新修改,把老数据转换成新数据