okhttp post请求 header post参数加密遇到的两个问题

如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题:

  1. Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在,网上其他文章说的是对中文字符,我想我这也没中文啊,但还是全部换成原生试了一下,果然,还是一样报错,坑爹的网友啊,哈哈!
    下面是测试用例demo的代码
package com.tcssj.mbjmb;import android.util.Base64;
import android.view.View;import java.nio.charset.StandardCharsets;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class AESUtil2 {public static byte[] base64ToDecode(String str) {byte[] byteStr = Base64.decode(str, Base64.DEFAULT);return byteStr;}public static String encode(byte[] key) {return Base64.encodeToString(key, Base64.NO_WRAP);}/*** 加密** @param content 需要加密的内容* @param key     加密密码* @return*/public static String encrypt(String content, String key) {return encrypt(content,key.getBytes());}public static String encrypt(String content, byte[] key) {try {//构造密钥SecretKeySpec skey = new SecretKeySpec(key, "utf-8");//创建初始向量iv用于指定密钥偏移量(可自行指定但必须为128位),因为AES是分组加密,下一组的iv就用上一组加密的密文来充当IvParameterSpec iv = new IvParameterSpec(key, 0, 16);//创建AES加密器Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);//使用加密器的加密模式cipher.init(Cipher.ENCRYPT_MODE, skey, iv);// 加密byte[] result = cipher.doFinal(byteContent);//使用BASE64对加密后的二进制数组进行编码return encode(result);} catch (Exception e) {e.printStackTrace();return content;}}/*** 解密* @param content* @param key* @return*/public static String decrypt(String content,  byte[] key) {try {SecretKeySpec skey = new SecretKeySpec(key, "utf-8");IvParameterSpec iv = new IvParameterSpec(key, 0, 16);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//解密时使用加密器的解密模式// 初始化cipher.init(Cipher.DECRYPT_MODE, skey, iv);byte[] result = cipher.doFinal(base64ToDecode(content));// 解密return new String(result);} catch (Exception e) {return content;}}
}
package com.tcssj.mbjmbimport android.os.Bundle
import android.os.Handler
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.tcssj.mbjmb.ui.theme.MbjmbTheme
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import okhttp3.Headers
import okhttp3.MediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody
import org.json.JSONObjectclass MainActivity : ComponentActivity() ,test {private  val TAG = "MainActivity"lateinit var  text:Stringoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)runBlocking(Dispatchers.IO) {val okHttpClient=OkHttpClient()
//        val build=okHttpClient.newBuilder()val jsonpost=JSONObject()jsonpost.put("type","text")jsonpost.put("mobile","81991419936")val body=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),AESUtil2.encrypt(jsonpost.toString(),AESUtil2.base64ToDecode("allWUzg1eFJ3ekpNQklUeQ==")))val json=JSONObject()json.put("sourceChannel","Orange")json.put("packageName","com.tcssj.mbjmb")json.put("adid","")json.put("version","12.0.0")json.put("uuId","")json.put("userId","")val request= Request.Builder().url("http://47.101.194.189:10018/auth/v3.1/user/sendVerifiyCode").header("HCFQ",AESUtil2.encrypt(json.toString(), "xDBrgJdnnY2w1Do7Ik6otonXQRgQyt46")).header("packageName","mbjmb").post(body).build()val response= okHttpClient.newCall(request).execute()response.toString()text=AESUtil2.decrypt(response.body().string(), AESUtil2.base64ToDecode("allWUzg1eFJ3ekpNQklUeQ=="))Log.i(TAG, "onCreate: "+AESUtil2.decrypt(text, AESUtil2.base64ToDecode("allWUzg1eFJ3ekpNQklUeQ==")))}setContent {MbjmbTheme {// A surface container using the 'background' color from the themeSurface(modifier = Modifier.fillMaxSize(),color = MaterialTheme.colorScheme.background) {Greeting(name =text)}}}}
}@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {Text(text = "$name!",modifier = modifier)
}@Preview(showBackground = true)
@Composable
fun GreetingPreview() {MbjmbTheme {Greeting("Android")}
}

第一个问题的原因就是我们参数进行加密后有换行符号\n,怎么解决呢?如下图,划线的部分你如果是用的Default,那就会报第一个错误,你需要使用NO_WRAP 不生成换行符的。
在这里插入图片描述
第二个坑就是返回的也是加密后的乱码,你需要拿回来解密的,那你下图中就不能使用body.toString() 方法,要用String()方法。(我是怎么发现的,我用apifox 工具(如果你接口调试还没使用上,拿走不谢,还是要用这么个工具,不然你来来回回启动app调试接口效率很低,但你会懒的使用,抗拒学新的,人吗,天性,但你要克服)调试接口的时候,发现工具和android里面的返回结果不一致)
在这里插入图片描述
因为看下图,如果你用了toString 方法 message当时空的,整个是空的框架,加密的内容okhttp无法转换成它的结构,那你就要用string(),拿到字符串自己解析。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/156933.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试经典150 | 链表】旋转链表

文章目录 Tag题目来源题目解读解题思路方法一:遍历 其他语言python3 写在最后 Tag 【单向链表】 题目来源 61. 旋转链表 题目解读 旋转链表,将链表的每个节点向右移动 k 个位置。 解题思路 方法一:遍历 本题题目意思清晰,实现…

掌握 JavaScript 的基本语法

一、javascript书写位置 JavaScript 可以写在 HTML 页面中的以下三个位置&#xff1a; 内联脚本&#xff1a;将 JavaScript 代码直接写在 HTML 元素的 onclick、onload、onsubmit 等事件属性中。例如&#xff1a; <button onclick"alert(Hello World)">点击我…

【计算机网络】计算机网络中的基本概念

文章目录 局域网LAN基于网线直连基于集线器组建基于交换机组建基于交换机和路由器组建 广域网WANIP地址端口号协议为什么要有协议知名协议的默认端口 五元组协议分层TCP/IP五层模型封装和分用 网络互连就是将多台计算机连接在一起&#xff0c;完成数据共享。数据共享本质是网络…

【易售小程序项目】后端部署、Uniapp项目Web部署

文章目录 Uniapp项目Web打包部署为什么不部署小程序Web打包前对项目进行调整网站、小程序切换增加constant.js来控制常量将js绑定到main.js的全局变量中 WebSocket差异监听键盘呼出导航条打包部署 后端项目打包部署打包前准备打包部署 Uniapp项目Web打包部署 为什么不部署小程…

通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

idea 配置checkstyle全过程

checkstyle是提高代码质量,检查代码规范的很好用的一款工具&#xff0c;本文简单介绍一下集成的步骤&#xff0c;并提供一份完整的checkstyle的代码规范格式文件&#xff0c;以及常见的格式问题的解决方法。 一&#xff0c;安装 打开idea的文件选项&#xff0c;选择设置&…

恒驰服务 | 华为云数据使能专家服务offering之大数据建设

恒驰大数据服务主要针对客户在进行智能数据迁移的过程中&#xff0c;存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题&#xff0c;通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容&#xff0c;支撑客户实现快速稳定上云&#xff0c;有效降低时间成本…

wireshark捕获DNS

DNS解析&#xff1a; 过滤项输入dns&#xff1a; dns查询报文 应答报文&#xff1a; 事务id相同&#xff0c;flag里 QR字段1&#xff0c;表示响应&#xff0c;answers rrs变成了2. 并且响应报文多了Answers 再具体一点&#xff0c;得到解析出的ip地址&#xff08;最底下的add…

react-markdown支持83版本的Chrome,解决Object.hasOwn is not a function问题

旧版浏览器支持 react-markdown用了一个ES2022的api&#xff0c;Object.hasOwn测试的时候一切正常&#xff0c;当我切换到生成环境的旧版的83的Chrome之后&#xff0c;发现会报Object.hasOwn is not a function这个错误。 https://github.com/remarkjs/react-markdown/issues/…

21.12 Python 实现网站服务器

Web服务器本质上是一个提供Web服务的应用程序&#xff0c;运行在服务器上&#xff0c;用于处理HTTP请求和响应。它接收来自客户端&#xff08;通常是浏览器&#xff09;的HTTP请求&#xff0c;根据请求的URL、参数等信息生成HTTP响应&#xff0c;并将响应返回给客户端&#xff…

css图片保持比例and图片占满整个div

一、非背景图 ①保持宽度固定 img { width: 200px; height: auto; } ②保持高度固定 img { height: 300px; width: auto; } ③保持比例 /* 比例不变 */ img { max-width: 100%; height: auto; } /* 垂直居中 */ img { max-width: 100%; height: auto; display: block; margin:…

高等数学啃书汇总重难点(十)重积分

方法性的一章&#xff0c;看着唬人&#xff0c;实际上定积分学得熟练&#xff0c;就可以很轻松的掌握这一章的内容&#xff0c;重点在于计算各种坐标下的二重或三重积分~ 1.几何意义 2.定义 3.性质 4.直角坐标计算二重积分 5.极坐标计算二重积分 6.三重积分 7.重积分的应用