RSA解密报错、base64加号问题
问题
今天和客户端联调接口的时候发现了一个问题。客户端用RSA加密的数据(加密后转为base64传输的),后台解析就会报错。排查了好久。其他的地方也用了同样的操作,也没有问题,但是唯独这个接口就解密不了。
分析
后来通过对比客户端发送的数据,和后台接收的数据,发现接收到的数据把+转为了空格。导致解析不了。
W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。
而在另一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。
Java中的URLEncoder本意是用来把字符串编码成application/x-www-form-urlencoded MIME格式字符串,也就是说仅仅适用于URL中的查询字符串部分,但是URLEncoder经常被用来对URL的其他部分编码,它的encode方法会把空格编成加号+,与之对应的是,URLDecoder的decode方法会把加号+和%20都解码为空格
解决方案
我这里直接简单粗暴,将空格替换为加号。