gpt4 book ai didi

java - 序列化期间的构造函数调用

转载 作者:行者123 更新时间:2023-11-30 04:10:13 25 4
gpt4 key购买 nike

我的代码中有一个 KeyChain 类,它允许我存储到磁盘并检索加密的凭据列表。

KeyChain的构建过程中,我初始化了AES密码。

为了序列化对象,我首先将凭据列表序列化到缓冲区中,然后加密该缓冲区并将其放入原始的 OutputObjectStream 中。

为了反序列化它,我尝试将ObjectInputStream读入缓冲区,对其进行解密并从中反序列化我的凭据,但要做到这一点,我需要首先构建密码。我不能这样做,因为反序列化不会调用我的构造函数。我该如何扭转这个局面?

key 链:

private void readObject(ObjectInputStream is) throws IOException {
byte[] buffer = new byte[512000];

int readBytes = is.read(buffer);

byte[] encryptedBytes = new byte[readBytes];
System.arraycopy(buffer, 0, encryptedBytes, 0, readBytes);

// Here it crashes and burns because i can't decrypt yet, the ciphers haven't been setup
byte[] decryptedBytes = decryptBytes(encryptedBytes);

ByteInputStream stream = new ByteInputStream(decryptedBytes, readBytes);
ObjectInputStream unsafeInputStream = new ObjectInputStream(stream);
try {
Keys = (List<Key>)unsafeInputStream.readObject();
} catch (ClassNotFoundException ex) {
// Fail miserably
}
}

private void writeObject(ObjectOutputStream os) throws IOException {
ByteOutputStream streamBytes = new ByteOutputStream();
ObjectOutputStream unsafeOutputStream = new ObjectOutputStream(streamBytes);

unsafeOutputStream.writeObject(Keys);
unsafeOutputStream.flush();

byte[] decryptedBytes = streamBytes.getBytes();

byte[] encryptedBytes = encryptBytes(decryptedBytes);

os.write(encryptedBytes);
os.flush();

Arrays.fill(decryptedBytes, (byte)0);
Arrays.fill(encryptedBytes, (byte)0);
}

问题:我不能只在 readObject 中调用 initCryptograhy(char[] password) 因为我那里没有可用的密码,我不能将其作为参数传递,这是问题的根源。

最佳答案

Java 实际上有一个名为 SealedObject 的工具用于加密序列化实例。也许这对您想要实现的目标更有效。我认为您正在做的事情和 SealedObject 所做的事情之间的主要区别在于它在第二阶段进行解密,而不是在初始反序列化中。

关于java - 序列化期间的构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com