背景
最近在处理用户敏感信息的加密和解密,其中遇到以下问题:
- 单个接口处理不好维护
- 如果直接在业务中加相关代码的话,耦合比较高
- 每个接口请求和响应的数据格式不一样,很难用同一套数据结构处理
调研
整个包加密
就是在请求和响应的时候对请求的数据包进行加解密,这是最快也最暴力的方式,但是会存在传输的数据膨胀,数据的加密因为算法的不同,明文的字符串加密后都会膨胀很多,甚至几倍,这是不可取的,无形之中变相的给服务增加压力,pass.
目标字段加解密
这个是从算法的加解密还是从传输的数据量考虑来说,性价比最高的
实现
思路
- 设置目标URL
- 先将请求的参数或者响应的内容变成字符串
- 用正则表达式去匹配
- 截取对应的字符串进行加解密,将结果替换旧的字符串
代码
正则表达式
1 | ruby复制代码private final String s = ""name":"(.*?)"|"mobile":"(.*?)"|"account":"(.*?)"|"idcard":"(.*?)"|"newPwd":"(.*?)"|"vcode":"(.*?)"|"validateCode":"(.*?)""; |
目标接口
1 | ini复制代码private String[] urlPatterns = {"/base/group/user" ,......}; |
请求包装类
1 | java复制代码public class PostHttpServletRequestWrapper extends HttpServletRequestWrapper { |
1 | typescript复制代码public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper{ |
响应包装类
1 | java复制代码public class ResponseWrapper extends HttpServletResponseWrapper { |
目标路径判断
1 | typescript复制代码public boolean dealWith(HttpServletRequest request, String[] strArr) { |
由于涉及加解密的过程已经以及业务,只贴出相关核心代码
1 | ini复制代码private void buildPost(ServletRequest request, FilterChain chain, HttpServletResponse responseWrapper,boolean isIos) throws Exception { |
1 | scss复制代码private void buildGet(ServletRequest request, FilterChain chain, HttpServletResponse responseWrapper,boolean isIos) throws Exception { |
核心:正则替换
1 | ini复制代码private String replace(String context, boolean isEncrypt) { |
这里其实也可以抽取的,用定义好的正则表达式字符串抽取的,只不过累了不想动了,交给后人吧,哈哈哈.
启用过滤器
后话
代码已经上线,已接受考验.由于涉及到公司的业务,敏感信息就不能展示了.
本文转载自: 掘金