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. 2つのメソッドは、シリアル化および逆シリアル化中のリフレクションを通じて、システムの最下層によって呼び出さます。

おすすめ

転載: blog.csdn.net/qianzhitu/article/details/103002673