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

Posted

技术标签:

【中文标题】使用带有签名、加密和编码的 JAXB【英文标题】:Using JAXB with signatures, encryption and encoding 【发布时间】:2012-07-03 07:56:10 【问题描述】:

最近,我们的任务是为我们的产品制定 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>

编辑:我实际上并没有传递信用卡数据。这里只是一个例子。

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

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

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

对此有任何解决方案的想法吗?我希望我只是缺少 JAXB 中的一些基本内容,并且在我得到这些内容之后会轻而易举。

谢谢!

【问题讨论】:

请注意:不要重新发明***。如果您真的需要签名和加密,请遵守规范:w3.org/TR/xmldsig-core。 (这方面有很多很棒的库,但据我所知,您在 jaxb 中找不到对它的 direct 支持)。如果您关心bloat,为什么首先使用xml?这是一个很棒的工具,但在紧凑性方面,XML 应该是您最后的选择。 【参考方案1】:

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

此类框架的示例(非详尽列表):Apache CXF、Glassfish Metro 等More info。

【讨论】:

以上是关于使用带有签名、加密和编码的 JAXB的主要内容,如果未能解决你的问题,请参考以下文章

JS进行Base64编码,MD5加密,URL编码实现快递鸟API接口签名验证

java加密基础 —— BASE64编码

编码加密Hash算法

API接口签名验证_MD5加密出现不同结果的解决方法

HmacSHA256签名加Base64编码加URL编码

用JS进行Base64编码,MD5加密,实现签名验证 调用快递鸟API接口 完成快递单号查询 JavaScript