如何将一个不可序列化的对象转换为字节数组?

5

我正在尝试使用javax.crypto.Cipher.doFinal(byte[])方法加密一个对象。但是,出于安全原因,该对象不能进行序列化。

那么,如何将对象转换为字节数组而不进行序列化呢?

--更新

使用序列化是使用此Cipher方法的唯一方法吗?因为据我所知,重要数据不应该是可序列化的。


1
而且我猜同样重要的是...再把它转换回来。 - Mark Byers
1
您想序列化一个对象,但是因为“出于安全原因,该对象无法序列化”。您是否知道可序列化用于将对象转换为byte[]? - Peter Lawrey
@Peter Lawrey,请查看我的更新。 - The Student
@Tom Brito 只是出于好奇,为什么重要数据不应该被序列化?我之前没有听说过这个问题。 - Bill K
1
@Bill K http://java.sun.com/security/seccodeguide.html 指南 5-1 避免将安全敏感类序列化 - The Student
@Tom Brito--哦,我明白了。如果您正在实现自己的安全管理器,那么这是有意义的!我想知道避免序列化如何有帮助,因为您可以反射到任何类中,但是如果您要覆盖SecurityManager,那么这是一个非常明智的步骤——否则当然毫无意义。 - Bill K
5个回答

4
我使用了com.fasterxml.jackson.databind.ObjectMapper。
  private static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.writeValue(os, obj);

    return os.toByteArray();
}

我们如何对该对象进行反序列化。 - Machhindra Neupane
抛出 InvalidDefinitionException 异常:找不到 org.json.JSONObject 类的序列化器,也没有发现任何属性来创建 BeanSerializer。 - Ran

0

你只需要对它的每个组件进行序列化。递归执行。最终,你会得到可以序列化的本地对象。

如果你通过实现Java的序列化方法来实现这一点,Java将确保你不会重复序列化任何对象,并为你处理引用。

简而言之,使对象可序列化。


与@Randy Simon的答案相同,请参见评论。 - The Student

0
解决了!不再使用getByteArray()来调用Cipher.doFinal(),而是在类内部直接使用Cipher.doFinal(),并增加了一个getEncryptedByteArray()方法;这样可以在不使类本身可序列化的情况下将数据序列化,并返回加密结果。对于这种方法是否有异议,请提出来讨论.. :)

-1
这是一个将类序列化为字节数组的简单示例。
public Class Foo {

    private boolean isHappy;
    private short happyCount;
    private Bar bar;

    public byte[] serializeData () throws IOException
    {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream( stream );

        out.writeBoolean(isHappy);
        out.writeShort( slope );

        // Serialize bar which will just append to this byte stream
        bar.doSerializeData(out);

        // Return the serialized object.
        byte[] data = stream.toByteArray();

        // Clean up.
        stream.close();

        return data;
    }
}

当然,你的情况中很多细节取决于你的类结构,但希望这能让你朝着正确的方向前进。

要进行反序列化,你只需要将上述过程反转即可。


3
决定该类不应该序列化的相同安全考虑,也应该决定不编写此方法。 - user207421

-1

java.beans.XMLEncoder/Decoder。


当然。你无法改变这一点。它存在于你喜欢或不喜欢的情况下,因此如果它是XMLEncodable,则相关类是不安全的。我认为你需要的是一个方法在类中提供SealedObject并使用私有成员数据构造它。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接