`
十三月的
  • 浏览: 168804 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

代码混淆与JSON数据序列化问题

阅读更多

 Java代码混淆和JSON数据序列化问题

 基本观点:

 第一点:Java代码生成的Jar文件很容易被反编译,常用工具JD-GUI(http://jd.benow.ca/)

 第二点:Jar文件常用的“加密”方式是混淆(有专门的混淆软件,有些需要收费的),使得类名、类中字段和方法名称等难以肉眼判断。例如

 

第三点:JSON协议使用方便,非常流行。常用框架由于可以使用自定义Model类,直接转换成JSON格式的数据,使用起来方便快捷。我使用的alibaba的fastjson.jar。(吐槽一下:虽然该包有不少bug需要进一步完善,整体已经相当不错了。) 例如:

 基本的Model

public class User {

	private String name;
	private int age;

	public User() {
	}

	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

 

 测试:

import com.alibaba.fastjson.JSONObject;

public class Test {

	public static void main(String[] args) {
		String json = JSONObject.toJSONString(new User("wsc", 25));
		System.out.println(json);
		User user = JSONObject.parseObject(json, User.class);
		System.out.println(user.getAge());
		System.out.println(user.getName());
	}
}

 

  打印:

{"age":25,"name":"wsc"}
25
wsc

第四点:

当使用框架转换Model为String类型的JSON数据时,通常是根据Model的set和get方法获取需要保存到磁盘的字段名称,常见手段是反射,如果直接获取Field,可能会产生很多,包括某些Field其实用户不想保存到磁盘transient字段或者中间变量字段,尽管fastjson.jar使用了字节码框架ASM来提高效率,也是需要通过set/get方法获取到字段名称。

问题:

如果使用了混淆,代码中字段和方法名称都被混淆,JavaBean的规则被改写,确实是能反序列化出对象,但是可能User名称已经被更改为AA,属性Name可能被更改为f.这个时候就会出现异常。

解决办法:

方法1:有些人推荐set和get方法不适用混淆,相当于Model的结构是公开的,虽然能够避免,总体不安全。

方法2:JSON序列化还有另外一种机制,Model是Map类型



 Map是直接获取字段名称的。
使用方法2的缺点是:当你反序列化的时候,如果你的Model里字段类型是自定义类对象,比如User对象中Age不是String,而是自定义类型Age,它是无法帮你自动反序列化成自定义对象Age的,需要手动创建。
 举例:

AppCheckBasic是一个基本Model,集成了JSONObject,由于JOSNObject本身是Map结构,所以AppCheckBasic也是一个Map。

AppCheckBasic有一个属性apps,它是List<AppBasic> 类型。

public class AppCheckBasic extends JSONObject {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	public void initial() {
		// 把所有层次结构初始化
		List<AppBasic> apps = null;
		Object obj = this.get("apps");

		// 初始化赋值后使用
		if (obj instanceof ArrayList) {
			apps = (List<AppBasic>) obj;
		}
		// 反序列化(非第一次初始化后)
		if (obj instanceof JSONArray) {
			JSONArray array = (JSONArray) this.get("apps");
			apps = new ArrayList<AppBasic>();
			for (int i = 0; i < array.size(); i++) {
				// AppBasic内部没有"复杂"数据类型
				AppBasic appBasic = JSON.parseObject(array.getString(i),
						AppBasic.class);
				apps.add(appBasic);
			}
		}

		// 初始化内容
		this.put("apps", apps);
	}

	// set和get方法是为了方便
	@SuppressWarnings("unchecked")
	public List<AppBasic> getApps() {
		List<AppBasic> apps = (List<AppBasic>) this.get("apps");
		return apps;
	}

	public void setApps(List<AppBasic> apps) {
		this.put("apps", apps);
	}

}

 除了必须手动反序列化重建自定义对象或者复杂对象如List等,为了方便为该Map类型的Bean定义set和get方法。

 

1
2
分享到:
评论

相关推荐

    看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇

    在本篇文档中,主题聚焦于“看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇”,探讨了Java语言中JSON处理库的安全问题和防御措施。首先,我们将分析目前主流的JSON处理库,包括Gson、Jackson和Fastjson,并...

    Go-Go非常快非常不安全的序列化

    1. **代码注入**:如果反序列化的数据来自不可信源,未经充分验证就直接反序列化,可能会导致代码执行。例如,恶意用户可以通过构造特定的序列化数据,使得在反序列化时执行任意代码。尽管Go的`gob`和`json`包本身并...

    android apk代码混淆

    Parcelable接口用于实现数据序列化,这对于Intent传递和保存状态非常重要。 - **-keepclassmembers class *.R$* { public static ; } -keepclass*.R$* { *; }**:保留所有R类的静态字段。这些字段包含了资源ID,...

    android 二进制传输 序列化

    4. **protobuf (Protocol Buffers)**:Google开发的一种数据序列化协议,它的性能优于JSON和XML,生成的序列化数据更小,解析速度快。protobuf支持多语言,包括Android平台。 5. **FastAndroidSerialization**:...

    Android代码混淆及签名.doc

    3. 涉及到网络请求 JSON 数据返回的实体类需要保存,不参与混淆,并且每个实体类都需要序列化,否则将无法解析。 Proguard.cfg 文件的配置项包括: * -optimizationpasses 5:设置混淆的次数。 * -...

    Python-包含ORMIOCMVC和日志JSON数据源代码生成等的Java框架

    【标题】中的“Python-包含ORM IOCMVC和日志JSON数据源代码生成等的Java框架”实际上存在一些混淆,因为Python和Java是两种不同的编程语言。然而,我们可以假设这里可能是在讨论一个Java框架,该框架受到了Python...

    jQuery Json v2.6.0

    同时,JavaScript中的一些特殊类型如Date、Function等,在JSON中并不直接支持,需要进行适当的序列化和反序列化处理。 此外,为了提高性能和减少网络传输的数据量,jQuery JSON v2.6.0包含了min.js版本的文件,这是...

    Gson解析的Bean不能混淆.zip_java gson 防止混淆

    在Java开发中,Gson库是一个非常常用的JSON序列化和反序列化库,它使得Java对象和JSON数据之间的转换变得简单。然而,在Android开发中,当我们进行代码混淆时,可能会遇到Gson解析的Bean不能混淆的问题。这个问题...

    android json相关

    4. **序列化与反序列化**: 序列化是将Java对象转换为JSON的过程,反序列化则是将JSON数据转换回Java对象。除了`Gson`,还可以使用`Jackson`或`moshi`等库进行序列化和反序列化。 5. **Proguard配置**: `...

    网传json格式相关jar包

    Jackson还支持注解,可以定制序列化和反序列化规则。 2. Gson:Google提供的Gson库,通过简单的API,可以将Java对象转换为对应的JSON表示,反之亦可。Gson的强大之处在于其灵活性,可以处理各种复杂的Java对象结构...

    JSON2 压缩版& 完整版

    JSON2库的主要功能包括JSON对象的序列化(将JavaScript对象转换成JSON字符串)和反序列化(将JSON字符串解析成JavaScript对象)。在一些老版本的JavaScript环境中,比如IE6和IE7,这些操作可能不被原生支持,这时...

    开源gson,最简单直观的demo演示

    开源的Gson库是Google提供的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。...通过这个项目,开发者可以学习到如何在实际代码中应用Gson,从而提升他们在数据序列化和反序列化方面的能力。

    解决JSON.stringify()自动将中文转译成unicode的问题

    1. **问题现象**:在IE8中使用`JSON.stringify()`方法序列化包含中文的对象时,序列化后的JSON字符串会把中文字符转换为Unicode编码。这意味着原本的中文字符会变成`\uXXXX`的形式,其中`XXXX`是字符的Unicode编码点...

    gson gson gson

    3. **复杂类型的序列化与反序列化**: Gson支持数组、集合、Map以及自定义类型。例如,解析包含多个Person对象的JSON数组: ```java List&lt;Person&gt; peopleList = gson.fromJson(jsonArrayString, new TypeToken...

    bb4-predprey-1.1.2.zip

    3. **Jackson注解(jackson-annotations)**:提供了一组注解,用于定制对象到JSON的映射规则,如`@JsonProperty`,`@JsonInclude`等,使得无需编写额外的代码即可实现复杂的序列化和反序列化逻辑。 4. **其他模块*...

    Java Web项目中Spring框架处理JSON格式数据的方法

    在Spring MVC中,可以利用注解来简化JSON数据处理的过程。使用@Controller注解标注类表示这是一个控制器,@RequestMapping注解用来指定请求映射的路径。当Spring MVC检测到方法上标注了@ResponseBody注解时,就会将...

    安卓开发-hotel宾馆系统.zip.zip

    2. Gson/Parcelable:数据序列化库Gson用于JSON数据解析,Parcelable则用于高效地序列化和反序列化对象,便于通过Intent传递。 3. LiveData与ViewModel:Android架构组件的一部分,LiveData用于实现数据在UI层的实时...

    retrofit2.0+okhtt3.0+gson+Rxjava

    在网络请求中,Gson 可以将服务器返回的 JSON 字符串解析成 Java 对象,或者将 Java 对象序列化成 JSON 字符串发送给服务器。在描述中提到的“改改 JSON 网站和 javaBean”,指的是根据服务器返回的数据结构,创建...

    python基于深度学习框架-PyTorch实战新闻数据集文本分类实战源代码

    在`News-dataset-text-classification-in-practice-master`文件夹中,可能包含一个数据集文件,如CSV或JSON格式,包含了新闻标题和对应的类别。我们使用pandas来读取和处理这些数据,将其分为训练集和测试集。 接...

Global site tag (gtag.js) - Google Analytics