记录一次Base64加密踩坑
背景
公司服务需要调用另一个服务,传输的数据采用Base64加密
一直采用的是:
String encode = Base64.encode(formatterJson.getBytes("UTF-8"));
最近需要在一台windows2008上部署项目,部署完成后Base64加密的中文出现乱码问题
一开始怀疑是Linux和windows编码的问题,使用代码获取windows上的编码为GBK
就采用了:
String encode = Base64.encode(formatterJson.getBytes(Charset.defaultCharset()));
Charset.defaultCharset() 获取当前服务器编码格式
!!!测试后发现还是会有乱码
询问了同事推荐使用
String encode = org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(formatterJson.getBytes("UTF-8"));
经测试确实解决了乱码问题
!!!!但是出现了一个新的更严重的问题----使用该编码的接口部分好使,部分解析失败!!!!
在代码中可以正常解析,在网页在线解析和另一个服务解析就失败格式不对!!!!
在中午午休中突然想起之前看过的一篇Base64踩坑指南,然后就去看了一下更换成了以下代码
(从org.apache.commons.codec.xxx的包换成了org.bouncycastle.xxx):
byte[] bytes = org.bouncycastle.util.encoders.Base64.encode(formatterJson.getBytes("UTF-8"));
String encode = new String(bytes, StandardCharsets.US_ASCII);
结果完美解决!!!!
简单看了代码应该是遇到一些字符两种Base64处理方式不同
具体请看:(104条消息) Base64算法不一致可能会导致的坑_base64 编码不一致_NoExceptionSir的博客-CSDN博客