做了一个项目需要使用SM3加密。具体代码如下
byte[] md = new byte[32];
SM3Digest sm3 = new SM3Digest();
sm3.update(originBody.getBytes(), 0, originBody.getBytes().length);
sm3.doFinal(md, 0);
String crc= new String(Hex.encode(md)).toUpperCase();
然后出现了奇怪的情况,我自己这边加密出来的crc和对方接口接收到之后算出来的crc不一样。找了好久都没有找到问题所在,结果发现问题是处在了String.getBytes()上面这个方法是使用默认的编码。如果是在Windows环境下,JVM默认编码为GBK。
Linux环境下默认编码为UTF-8。
那么也就导致在程序中,使用String等类型时,默认采用编码会根据系统的不同使用了不同的编码。
可以在运行JVM时指定-Dfile.encoding=utf-8参数来规定编码。
在Tomcat中配置catalina文件
Linux中,在catalina.sh配置JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
Windows中,在catalina.bat配置set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8。
所以呢我现在的问题应该就是我这边tomcat部署在windows环境中的,所以用了GBK,而对方在SM3加密的时候服务器部署在linux上面,用了UTF-8,所以我们两边加密出来的东西永远不一样。
然后我到服务器上把在catalina.bat 配置 第二行加上了 set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8。问题解决。
写此微博,免得下次遇到这个问题再胡思乱想,这已经是第二次了。