OkHttp 加密拦截器封装

该文介绍了如何在Java和Kotlin中创建一个Interceptor来处理HTTP请求和响应的加解密。主要使用RSA算法,针对GET参数和POST的请求体进行加密,并在接收到200响应时解密响应内容。代码示例展示了如何在请求和响应链中插入拦截器进行处理。

很多时候,我们都要对request 和response 进行加解密,这时候就需要对Http 重定向,自定义拦截器,将请求和返回值进行拦截,处理后在发送或者解析。下面会分为java 和kotlin 版本。

加密会分为 get 的参数加密 、post 的body 加密,加密的方式大部分都是使用RSA 加密。
直接看代码吧。

java版

public class DataEncryptInterceptor implements Interceptor {
   
   
    private static final String TAG = DataEncryptInterceptor.class.getSimpleName();

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
   
   

        Request request = chain.request();
        Request.Builder requestBuilder = request.newBuilder();
        String requestMethod = request.method().toLowerCase().trim();

        HttpUrl url = request.url();


        //协议地址
        String scheme = url.scheme();//  http https
        //域名
        String host = url.host();//   127.0.0.1
        //接口名
        String path = url.encodedPath();//  /test/upload/img

        String key = PrefsUtil.getInstance().getString(Constants.PUBLIC_KEY, "");


      //判断是否需要加密,如果次路径不需要加密,则返回原始request即可
        if (path.isEmpty() || (!path.contains(ApiAddress.CHECK_ROOM_SECRET_OUT) && !path.contains(ApiAddress.CHECK_ENCRYPTION)) || TextUtils.isEmpty(key)) {
   
   
            return chain.proceed(request);
        }

        //判断是get 还是post(get 和 delete 是一样的请求方式)
        if (requestMethod.equals("get") || requestMethod.equals("delete")) {
   
   
            if (url.encodedQuery() != null) {
   
   
                try {
   
   
                    String queryparamNames = request.url().encodedQuery();

                   //如果参数是空,则不加密
                    if (queryparamNames == null || TextUtils.isEmpty(queryparamNames)) {
   
   

                        //构建新的请求
                        String newUrl = scheme + ":" + host + path;
                        request = request.newBuilder().url(newUrl).build();
                    } else {
   
   
                       //对参数进行RSA加密后 ,构建新请求
                        String newParams = RSAUtils.encrypt(queryparamNames, key);

                        //构建新的请求
                        String newUrl = scheme + ":" + host + path + "?" + newParams;
                        request = request.newBuilder().url(newUrl).build();
                    }


                } catch (Exception e) {
   
   
                    e.printStackTrace();
                    return chain.proceed(request);
                }
            }

        } else {
   
   

            //post 请求
            try {
   
   
                //获取body 中内容
                RequestBody oldRequestBody = request.body();
                Buffer requestBuffer = new Buffer();
                oldRequestBody.writeTo(requestBuffer);
                String oldBodyStr = requestBuffer.readUtf8();
                
                requestBuffer.close();
                //fromBody 加密
                if (request.body() instanceof FormBody) {
   
   


                    //随机AES密钥加密oldBodyStr

                    String encrypt = RSAUtils.encrypt(oldBodyStr, key);

                    Log.e(TAG, "the encrypt is" + encrypt);
                    MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
                    RequestBody newBody = RequestBody.create(mediaType, encrypt);

                    request = request.newBuilder()
                            .
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值