服务器返回信息带有中文 验签不通过解决办法

解决办法1:

查看是否是字符集的问题.由于服务器和本地的字符集不同导致信息的二进制编码不同所以同样的数据签名的结果是不一样的.解决方案:首先使用InputStream读取服务器返回信息,如果知道服务器返回的具体字符集就可以使用Reader类帮忙读取了.

InputStream is = conn.getInputStream();
ByteArrayOutputStream outArray=new ByteArrayOutputStream();
int len=0;
byte data[]=new byte[1024];
while((len=is.read(data))!=-1){
    outArray.write(data,0,len);
}
is.close();

然后使用String的构造器构造出一个在系统已知可辨别的字符集,记住是可以被现在的环境打印出来的不是乱码的哈

String xml1 = new String(outArray.toBytes(),"GBK");

然后在验签的时候对xml1字符串使用getBytes("GBK");来获取byte[]数组.然后使用这个数组去签名吧,如果GBK不对就用UTF-8,UTF-8不对就用GB2312...随意吧 知道成功为止..

CAUtil.verify(xml1.getBytes("GBK"),resign.getBytes())) //自定义的验签方法.

原因:

在java中你对字符集使用getBytes的时候会获取本身环境默认字符集的byte[],使用getBytes的时候应该制定获取的字符集格式.签名都是针对byte[]做签名,如果byte[]内的内容不同,获取的签名不通





你可能感兴趣的:(服务器返回信息带有中文 验签不通过解决办法)