前段时间在过接口md5校验的时候踩过这个坑,校验方式:MD5(base64(字符串)),在开发环境(window)下没问题,但是发布在linux上面就出现bug,一直校验不通过,但数据放回开发环境又没问题,分别在window环境与linux环境打印原字符串、base64加密、md5串,发现源字符串、base64加密一致,md5串不一致。
第一反应是MD5加密位数不一样,同个字符串在MD5加密不一致的唯一可能是MD5位数不一样,同个段代码明显不可能。观察打印出来的字符串,发现base64加密后的字符串换行了,找到问题了,linux换行是“\n”,window换行“\r\n”,mac换行“\t”。所以虽然打印base64是一样的,但是在经过第二轮MD5(获取其他加密方式),会有换行符的区别,当然如果双方都是用一直的系统不会出现这个问题。
String base64 = Base64.encodeBase64(token2.getBytes()).toString().replaceAll("[\\s*\t\n\r]","")
String md5Token = DigestUtils.md5Hex(base64);
后面了解到是使用Base64包的问题,使用org.apache.commons包下的Base64.encodeBase64String不会有换行符。