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. 두 메서드는 직렬화 및 역 직렬화 중에 리플렉션통해 시스템 맨 아래 계층에서 호출 됩니다 .

추천

출처blog.csdn.net/qianzhitu/article/details/103002673