Java中的默认序列化存在安全问题如何解决?

Java中的默认序列化是存在一些安全问题的,例如对象序列化以后的字节通过网络传输,有可能在网络中被截取。那如何保证数据安全呢?通常可以在对象序列化时对对象内容进行加密,对象反序列化时对内容进行解密。

具体实现过程分析:

  1. 在序列化对象中添加writeObject(ObjectOutpuStream out)方法对内容进行加密再执行序列化。
  2. 在序列化对象中添加readObject(ObjectInputStream in)方法对内容先进行反序列化然后在执行解密操作

代码实现:

class SysLog implements Serializable{
	private static final long serialVersionUID = -5296788134693797316L;
	/**日志id*/
	private Integer id;
	/**操作用户*/
	private String username;
	//private Date createdTime;
	
	/**此方法会在调用对象流的的writeObject方法时执行*/
	private void writeObject(ObjectOutputStream out) throws IOException{
		//1.获取一个加密对象(java.util)
		Base64.Encoder encoder=Base64.getEncoder();
		//2.对内容进行加密
		byte[] array=encoder.encode(username.getBytes());
		//3.将加密结果重新赋值给username
		username=new String(array);
		//4.执行默认序列化
		out.defaultWriteObject();//序列化
	}//方法的声明是一种规范
	
	private void readObject(ObjectInputStream in)
		throws IOException, ClassNotFoundException{
		//1.执行默认反序列化
		in.defaultReadObject();
		//2.获取解密对象
		Base64.Decoder decoder=Base64.getDecoder();
		//3.执行解密操作
		byte[] array=decoder.decode(username);
		username=new String(array);
	}
	
	public void setId(Integer id) {
		this.id = id;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@Override
	public String toString() {
		return "SysLog [id=" + id + ", username=" + username + "]";
	}
}

说明: writeObject/readObject方法:

  1. 访问修饰符,返回值类型,方法名,参数应与如上代码相同(java规范中定义)
  2. 两个方法会在序列化和反序列化时系统底层通过反射调用.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值