我想将SOAPMessage转换为字节数组,以便可以对其进行加密,然后在代理服务器中对其进行解密,该代理服务器将代表我进行Web服务的调用。
问题在于SOAPMessage没有实现java.io.Serializable,因此我无法对其进行加密。

我用它来序列化

public static byte[] serializeSoapMessage (SOAPMessage sm){
    try {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        sm.writeTo(baos);
       byte[] bytes= baos.toByteArray();
       return bytes;
    } catch (SOAPException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}


但是反序列化是一个问题,因为ObjectInputStream需要实现java.io.Serializable

谢谢您的问候:)

最佳答案

我认为您不太了解SOAPMessage.writeTo在做什么(或对象流如何工作)。据我所知,writeTo将为SOAPMessage创建XML并将其作为字节写入到给定的流中。要读取它,请使用MessageFactory及其createMessage方法。写入流的信息不是对象(ObjectInputStream期望的),而是数据。

要执行您想要的操作,请将您的ByteArrayOutputStream包装在CipherOutputStream中(请参阅this question,以了解如何使用密码流包装流)并改为调用sm.writeTo(cipherOutputStream)。这将加密流中的字节,然后您可以将字节发送到Web服务。

通过将接收到的字节包装在ByteArrayInputStream中,然后将其包装在CipherInputStream中,使Web服务运行解密。将结果CipherInputStream赋予MessageFactory,它将重建原始的SOAPMessage。

诚然,我不是Web服务方面的专家,所以我不能为您提供特定解决方案的工作代码,但是这种方法肯定会给您发送加密的byte[],其中包含加密的SOAPMessage

请注意,对象流始终不会加密任何内容。您可能会这样认为,因为其输出或多或少不可读,但绝不是加密的。获得加密的唯一方法就是使用加密。

为您提供一些参考:


Wrapping streams with cipher streams
MessageFactory
SOAPMessage.writeTo
CipherInputStreamCipherOutputStream
Lesson on cipher streams
Lesson on Cipher which is needed for cipher streams


希望这足以让您入门。

10-08 13:33