¿Cómo resolver el problema de seguridad de la serialización predeterminada en Java?

La serialización predeterminada en Java tiene algunos problemas de seguridad. Por ejemplo, los bytes después de la serialización del objeto se transmiten a través de la red y pueden ser interceptados en la red. Cómo garantizar la seguridad de los datos Por lo general, el contenido del objeto se puede cifrar cuando el objeto se serializa y descifrar cuando se deserializa el objeto.

Análisis específico del proceso de realización:

  1. Agregue el método writeObject (ObjectOutpuStream out) al objeto serializado para cifrar el contenido y luego realizar la serialización.
  2. Agregue el método readObject (ObjectInputStream in) al objeto serializado para deserializar el contenido primero y luego realice la operación de descifrado

Código:

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 + "]";
	}
}

Descripción: método writeObject / readObject:

  1. El modificador de acceso, el tipo de valor de retorno, el nombre del método y los parámetros deben ser los mismos que el código anterior (definido en la especificación de Java)
  2. Los dos métodos serán llamados por la capa inferior del sistema a través de la reflexión durante la serialización y deserialización .

Supongo que te gusta

Origin blog.csdn.net/qianzhitu/article/details/103002673
Recomendado
Clasificación