Android数据传输中的参数加密代码示例
作者:ljtyzhr 发布时间:2021-05-25 23:54:43
标签:android,数据传输加密
Android开发中,难免会遇到需要加解密一些数据内容存到本地文件、或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密函数使用不正确,加密数据很容易受到逆向破解攻击。还有很多开发者没有意识到的加密算法的问题。
1、数据传输
1)、http请求中,最常用的方法有两种:get和post;一般post请求适合做提交,而get请求适合做请求数据
2)、数据的加密,大概有三种常用的:AES,DES,Base64
2、Base64加密
这里使用的aes加密,然后再将字符串使用Base64编码,其中有增加向量,是为了提高加密破解难度,一段参数加密的方法如下:
/**
* 对post请求数据进行加密
* @param params
* @return
* @throws Throwable
*/
public static byte[] encryptParams(HashMap<String, String> params) throws Throwable{
if (params == null){
return null;
}
StringBuilder stringBuilder = new StringBuilder();
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String,String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
if (stringBuilder.length() > 0){
stringBuilder.append("&");
}
stringBuilder.append(key).append("=").append(Uri.encode(value));
}
byte[] buff = stringBuilder.toString().getBytes("utf-8");
byte[] iv = new byte[16];
Random random = new Random();
random.nextBytes(iv);
byte[] data = Aes.encrypt(buff,PASSWORD,iv);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(iv,0,iv.length);
baos.write(data,0,data.length);
byte[] out = baos.toByteArray();
try {
baos.close();
}
catch (Throwable e){
e.printStackTrace();
}
return out;
}
3、遇到问题
在使用Base64的过程中,遇到一些问题,如下:
1)请求的字符串被截断,抓取链接之后,得到一段空格的字符串。经过分析,其实这里是换行。。。。。
解决的方法是,在请求的时候,将输出的字符串,做如下处理:
将
android.util.Base64.encodeToString(input, Base64.DEFAULT)
换成
android.util.Base64.encodeToString(input, Base64.NO_WRAP);
2)除了上面的是因为换行之外,其实也真的存在空格的情况,这个时候,可以使用替换,如下:
// 加密:
byte[] bodyBytes = RequestManager.encryptParams(hashMap);
// 使用base64encode做最后的加密
String result = new BASE64Encoder().encode(bodyBytes);
String ans_url = headUrl + result.replaceAll("\n","");
4、总结
base64encode编码会在76位之后,将字符串截断。在含有中文字符串的情况下,会出现加号被替换成空格的情况。
Android开发实现文件关联方法介绍
Android分包MultiDex策略详解
如有不足之处,欢迎留言指出。
来源:http://blog.csdn.net/ljtyzhr/article/details/45031307


猜你喜欢
- MyBatis全局配置文件MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(propertie
- 一、Thread.start()与Thread.run()的区别通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就
- 继承反应了类和类之间的关系。世界上很多事物都是有共性的,共性的那一部分我们就抽象为基类,用于派生其它类,这样提高了代码的复用性,使得代码的结
- 需求基于MTK8163 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加思路需求开始做之前,一定要研读SystemUI Navig
- Android中的异步消息机制分为四个部分:Message、Handler、MessageQueue和Looper。其中,Message是线
- 关于为什么需要创建单例?这里不过多介绍,具体百度知。 关于C# 创建单例步骤或条件吧1、声明静态变量;2、私有构造函
- 直接上代码新建DecimalInputTextWatcher类继承TextWatcher (代码可直接复制使用) import androi
- 一种可以设置滑动动画的控件,只显示一行布局,在布局文件中的ViewFlipper控件中顺序写好每一行的布局(1).MainActivity.
- 公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不
- 一、Struts2文件上传 Struts2的文件上传实现非常简单,只需要简单几步就可完成;注意:(1)文件上传的struts2标签
- 本文实例讲述了android中ListView数据刷新时的同步方法。分享给大家供大家参考。具体实现方法如下:public class Mai
- 在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。请看下方:深度克隆类:Java代码 import java.i
- 欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demo
- 表示 Windows 注册表中的项级节点。 此类是注册表封装。继承层次结构System.Object &nb
- 我们写的主类中的main()方法是如何被Java虚拟机调用到的?在Java类中的一些方法会被由C/C++编写的HotSpot虚拟机的C/C+
- 本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL)使用DAL的最大好处是通过直接使用一些类似in
- 前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jd
- 本文实例讲述了Android实现在xml文件中引用自定义View的方法。分享给大家供大家参考,具体如下:在xml中引用自定义view方法一:
- 前言对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完
- 什么是字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程