Java 使用带有签名、加密和编码的JAXB

Java 使用带有签名、加密和编码的JAXB,java,xml,jaxb,pki,Java,Xml,Jaxb,Pki,最近,我们的任务是为我们的产品设计一个XML通信规范。我的一些同事对JAXB在整理和解压XML文档方面有很高的评价。我花了一些时间来玩弄它,我知道它们是从哪里来的。它使简单的XML文档变得简单 现在让我们把它提高一个档次。我希望在我们的通信模型“内置”签名验证中看到的一件事是为在我之后使用它的人进行签名验证。我遇到的一个问题是,为了验证签名,我需要将相应的XML视为字节。让我们举个例子 <topLevel> <sensitiveData encoding="UTF8"&

最近,我们的任务是为我们的产品设计一个XML通信规范。我的一些同事对JAXB在整理和解压XML文档方面有很高的评价。我花了一些时间来玩弄它,我知道它们是从哪里来的。它使简单的XML文档变得简单

现在让我们把它提高一个档次。我希望在我们的通信模型“内置”签名验证中看到的一件事是为在我之后使用它的人进行签名验证。我遇到的一个问题是,为了验证签名,我需要将相应的XML视为字节。让我们举个例子

<topLevel>
    <sensitiveData encoding="UTF8">
        <creditCard>
            <number>1234-1234-1234-1234</number>
            <expDate>Oct 2020</expDate>
        </creditCard>
    </sensitiveData>
    <signatureOfSensitiveData algorithm="SHA1WithRSA">VGhpc0lzQVNpZ25hdHVyZQ==</signatureOfSensitiveData>
</topLevel>

1234-1234-1234-1234
2020年10月
VGhpc0lzQVNpZ25hdHVyZQ==
编辑:我实际上并没有传递信用卡数据。这里只是一个例子

如果我能得到“sensitiveData”标记中所有内容的
字节[]
(由编码决定)表示,那就太好了。我甚至不介意在
字节[]
上再次调用“unmarshall”

这也为我们打开了其他的大门。我们实际上可以在元素中引入“压缩”和“加密”属性。如果我们可以将它们视为
字节[]
,那么我们就可以对它们进行膨胀和解密,然后将它们传递给再次解密的对象

旁注:我认为如果您对XML进行base64编码,然后将其包含在一个元素中,这是可行的。但这会迫使我们将64个甚至简单的文档作为基础,并在我们的消息中引入一些不必要的膨胀

有什么解决办法吗?我的希望是,我只是缺少了JAXB中的一些基本内容,在我得到这些之后,这将是一件轻而易举的事


谢谢

您可以使用支持WS-Security的JAX-WS框架。JAX-WS依赖于JAXB,但添加了支持SOAP协议的通信部分,WS-Security是SOAP/XML中XML签名、加密和其他安全特性的标准。WS-Security依赖于评论中提到的XML签名和加密标准


此类框架的示例(非详尽列表):ApacheCXF、Glassfish Metro等

请注意:不要重新发明轮子。如果您确实需要签名和加密,请遵守规范:。(尽管据我所知,在jaxb中找不到对它的直接支持,但有很多很好的库可以实现这一点)。如果您担心
膨胀
,为什么要首先使用xml?这是一个很好的工具,但说到紧凑性,XML应该是您最后的选择。