1

我在java中遇到xml序列化问题。实际上,我必须为我的加密程序创建一个 xml 标头,它应该如下所示:

<EncryptedFileHeader>
    <Algorithm>algorithm name</Algorithm>
    <KeySize>key size</KeySize>
    <BlockSize>block size</BlockSize>
    <CipherMode>mode</CipherMode>
    <IV>initial vector</IV>
    <ApprovedUsers>
        <User>
            <Email>mail</Email>
            <SessionKey>session key</SessionKey>
        </User>
    </ApprovedUsers>
</EncryptedFileHeade>
*ciphered data*

其中加密数据超出标头。我考虑过一个 xml bean,但它给了我很多开销数据,比如节点属性和属性,比如:

<void property="approvedUsers">
  <void index="0">

JAXB 提供了非常好的 noode Lookout,但我传递的每个数据都转换为 Base64。这是最大的问题。“加密数据”和“会话密钥”必须以纯二进制格式(字节[])存储。即使我使用 xml beans,它也是这样存储的:

<array class="byte" length="428704">
   <void index="0">
 <byte>43</byte>
</void>
<void index="1">
 <byte>93</byte>
</void>
<void index="2">
 <byte>76</byte>
</void>
<void index="3">
 <byte>48</byte>
</void>
<void index="4">
...

另一种方法是具有快速信息集的 JAXB .. 但我想知道是否有另一种简单的解决方案来解决这个问题。

编辑:在这里我找到了一些解释我的问题/误解在此处输入链接描述

4

3 回答 3

1

您不能在 XML 中放置任何字节,有限制,请参阅http://en.wikipedia.org/wiki/Valid_characters_in_XML

于 2013-05-07T16:19:38.007 回答
1

如果默认表示不够,您可以使用 JAXB (JSR-222) 实现XmlAdapter将 a 转换为您想要的任何表示。byte[]

public class ByteArrayAdapter extends XmlAdapter<String, byte[]> {
    ...
}
于 2013-05-07T18:20:30.747 回答
0

此问题的解决方案是使用 jaxb 序列化一个流中的标头并关闭它。并在下一个流中使用另一个流序列化到现有标题。要反序列化,只需将其读取为文本流并使用正则表达式查找第一个结尾“”,将其解组为对象。检查此大小并跳过标头在另一个流中读取此文件以反序列化加密数据

于 2013-10-03T14:35:11.710 回答