前言
- 对接第三方系统,接口请求需要带上签名标识和返回数据需要验签。
- 整个系统使用编码格式为UTF-8
问题描述
IDEA进行对接调试,使用国密加解密生成签名标识和验签没问题,但是打成jar包后进行部署后,一直验签错误。
问题排查
进行部署环境DEBUG跟踪代码发现部署环境的String.getBytes()和本地直接IDEA启动String.getBytes()两个字节长度不一致,因此导致部署环境验签等问题
查看String.getBytes()相关encode代码,代码如下:
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
String csn = AccessController.doPrivileged(
new GetPropertyAction("file.encoding"));
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}
static byte[] encode(char[] ca, int off, int len) {
String csn = Charset.defaultCharset().name();
try {
// use charset name encode() variant which provides caching.
return encode(csn, ca, off, len);
} catch (UnsupportedEncodingException x) {
warnUnsupportedCharset(csn);
}
try {
return encode("ISO-8859-1", ca, off, len);
} catch (UnsupportedEncodingException x) {
// If this code is hit during VM initialization, MessageUtils is
// the only way we will be able to get any kind of error message.
MessageUtils.err("ISO-8859-1 charset not available: "
+ x.toString());
// If we can not find ISO-8859-1 (a required encoding) then things
// are seriously wrong with the installation.
System.exit(1);
return null;
}
}
上面代码说明,默认的编码格式会取file.encoding值。查看启动脚本内容,部分内容如下:
java -Xmx256M -Xms256M -jar -Dfile.encoding=gbk xxx.jar
指定了 -Dfile.encoding=gbk 因此String.getBytes()不是使用UTF-8编码导致验签等问题。
解决方法
将 -Dfile.encoding=gbk 改为 -Dfile.encoding=UTF-8即可。
其他
将-Dfile.encoding改为UTF-8可能导致windows的cmd控制台输出乱码,猜想之前写这个脚本的人应该是要了控制台不乱码才指定编码格式。
如果想解决控制台显示乱码问题,可以如下操作即可
- 更换CMD的 活动代码页编号, 即更改字符集,命令:chcp 65001
- 修改字体,步骤打开CMD窗口,修改它的配置:属性 ->字体 ->选择 Lucida Console