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.mzph.cn/news/126030.shtml

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

相关文章

高效改名,文件夹名称替换:一键批量替换文件夹名中间部分内容

在我们的日常生活和工作中,经常需要处理大量的文件夹,其中有些文件夹名称可能包含我们需要替换的内容。但如果我们一个一个地手动修改文件夹名称,不仅耗时而且容易出错。为了解决这个问题,我们可以使用云炫文件管理器高效的文件夹…

[AUTOSAR][诊断管理][ECU][$2F] 通过ID控制IO

文章目录 一、简介服务功能功能描述应用场景服务请求请求格式控制参数(IOCP)请求实例服务响应响应格式正响应实例负响应NRC支持二、 示例代码2f_io_ctl_by_id.c一、简介 2F诊断服务主要在车身域比较常见,比如车窗控制,传感器开关、执行器控制等。 UDS诊断服务协议都以ISO标准…

Centos虚拟机安装配置与MobaXterm工具及Linux常用命令

目录 一、Centos操作系统 1.1 Centos介绍 1.2 Centos虚拟机安装 1.3 配置centos的镜像 1.4 虚拟机开机初始设置 1.4.1 查看网络配置 1.4.2 编辑网络配置 二、MobaXterm工具 2.1 MobaXterm介绍 2.2 MobaXterm安装 2.3 切换国内源 三、Linux常用命令和模式 3.1 …

【漏洞复现】CNVD-2023-08743

【漏洞复现】 CNVD-2023-08743 【漏洞介绍】 Hongjing Human Resource Management System - SQL Injection 【指纹】 title”人力资源信息管理系统” 【系统UI】 【payload】 /servlet/codesettree?flagc&status1&codesetid1&parentid-1&categories~31…

Word插入图片显示不全?学会这4个方法,轻松解决!

“为了让我的文档看起来更专业,我在Word里插入了一些图片,但是这些图片有些只显示了部分,有些都无法正常显示。有什么方法可以让图片显示齐全吗?” 在使用Word时,添加一些图片不仅会让我们的文档看起来更美观&#xff…

探求flutter全栈开发

显示一种网络图片 import package:flutter/material.dart; main(){runApp(MaterialApp(theme: ThemeData.dark(),home:Home(),));}class Home extends StatelessWidget{overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar:AppBar(t…

2023-2024-1高级语言程序设计第1次月考

7-1-1 计算摄氏温度 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…

高频SQL50题(基础版)-1

文章目录 主要内容一.SQL练习题1.1757-可回收且抵制的产品代码如下(示例): 2.584-寻找用户推荐人代码如下(示例): 3.595-大的国家代码如下(示例): 4.1148-文章浏览代码如下(示例): 5…

CT MR 三维重建可视化系统

前言 本文通过研究医学可视化的不同算法,在 vc环境下,以可视化软件包VTK 为平台,编程设计实现了三维建模系统,实现了 DICOM图像的三维重建。 材料与方法 使用符合 DICOM 标准的临床 CT、MRI图像数据,在 vc环境下&…

Python 算法高级篇:最小生成树算法的优化与应用

Python 算法高级篇:最小生成树算法的优化与应用 引言 1. 最小生成树问题简介2. Prim 算法3. Kruskal 算法4. 优化与比较5. 案例应用:通信网络设计6. 总结 引言 最小生成树( Minimum Spanning Tree , MST )是图论中的一…

利用python绘制多个箱型图

文章目录 1. 图片2. 代码 1. 图片 图片示例如下所示: 2. 代码 代码如下所示: # Define the custom order based on atmospheric stability custom_order [vus_0, us_1, ne_2, ws_3, ws_4, s_5, s_6, s_7, vs_8, vs_9]# Step 1: Reorder the statis…

基于jsp,ssm物流快递管理系统

开发工具:eclipse,jdk1.8 服务器:tomcat7.0 数据库:mysql5.7 技术: springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分,功能介绍如下: 一、用户(前台)功能: 用…

node使用fs模块(三)—— fs模块的其他使用(复制文件、文件的重命名和移动、删除)

文章目录 前言一、fs的复制1.方式一(先读取后写入)2.方式二(流式读取写入)3.两种方式的区别 二、文件的重命名和移动(fs.rename)1. 参数2. 基本使用(文件的重命名)3. 基本使用(文件的移动)4.文件…

图书馆书目推荐数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

公共字段自动填充、菜品管理

一、公共字段填充 1.1、问题分析 1.2、实现思路 1.3、代码开发 1.3.1、自定义注解 import com.sky.enumeration.OperationType;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import jav…

【红蓝攻防鸿篇巨著】ATTCK视角下的红蓝对抗实战指南

【文末送书】今天推荐一本网安领域优质书籍《ATT&CK视角下的红蓝对抗实战指南》,本文将从其亮点与内容出发,详细阐发其对于网安从业人员的重要性与益处。 文章目录 背景简介内容文末送书 背景 根据中国互联网络信息中心(CNNIC&#xff0…

正则表达式包含数字和字符匹配

至少6位。 pattern : (?.[0-9])(?.[A-Za-z])[0-9A-Za-z]{6,} 正则表达式中的“?”是一个正向预查字符,它的意思是匹配前一个字符出现的最少一次。具体来说,当一个匹配出现时,它会检查前一个字符是否符合要求,如果符合&#xf…

Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴

在如今的高清时代,谁能拒绝一款能够轻松将高清影片刻录成蓝光DVD的刻录机呢?而Yuhan Blu-ray DVD Creator for Mac正是这样一款令人惊艳的软件。 作为一款专为Mac用户打造的蓝光DVD刻录机,Yuhan Blu-ray DVD Creator for Mac支持将各种高清视…

媒体宣传如何助力品牌发展

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传可以在多方面助力品牌发展,下面是一些关键的方式: 1. 提高品牌知名度:媒体宣传可以将品牌曝光给更广泛的受众,使更多人了解您的品…

【Nginx37】Nginx学习:SSL模块(一)简单配置与指令介绍

Nginx学习:SSL模块(一)简单配置与指令介绍 又是一个重点模块,SSL 模块,其实就是我们常见的 HTTPS 所需要的配置模块。HTTPS 的重要性不用多说了吧,现在所有的 App、小程序 都强制要求是 HTTPS 的&#xff0…