记录一次Base64加密踩坑

597 阅读1分钟

记录一次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博客