Java XML加密和解密仅限JDK 6,无任何第三方API

Java XML加密和解密仅限JDK 6,无任何第三方API,java,xml,xml-encryption,Java,Xml,Xml Encryption,我想现在可以使用JDK 6 api加密和解密XML文档了。我不想使用任何第三方api,比如ApacheSantuario。其全部意图是,如果对XML文件进行加密并将其发送到用C#.Net、Python或任何其他语言开发的系统,则可以对加密的XML文档进行解密。如果可能,可以与各方共享公钥。目标不是加密整个文件。我知道,这很容易做到。我想清楚地加密XML文档。它看起来应该像一个xml文件,但正文内容应该像Apache Santuario那样进行加密。第一步是确定所有三个系统都支持的加密方案。我认为

我想现在可以使用JDK 6 api加密和解密XML文档了。我不想使用任何第三方api,比如ApacheSantuario。其全部意图是,如果对XML文件进行加密并将其发送到用C#.Net、Python或任何其他语言开发的系统,则可以对加密的XML文档进行解密。如果可能,可以与各方共享公钥。目标不是加密整个文件。我知道,这很容易做到。我想清楚地加密XML文档。它看起来应该像一个xml文件,但正文内容应该像Apache Santuario那样进行加密。

第一步是确定所有三个系统都支持的加密方案。我认为AES-256是一个很好的方案,但Python并不直接支持它(它需要一个新的接口)

你不应该试图实施你自己的计划;密码学很难,甚至更难做到正确。举个例子:全世界的密码学专家花了几年时间才建立了AES。因此,除非你比全世界都聪明,否则你的算法就会有缺陷

这也意味着您可能不得不求助于外部库,因为编写一个好的加密算法也是非常困难的,所以当三个运行时都不支持一个好的方案时

识别模式后,对一些测试数据进行编码,以确保每个系统都能正确地对其进行编码和解码。这些单元测试将使以后的调试更加容易,因为您可以确保问题不在无法读取的二进制数据中

最后一步是让他们使用XML完成所有工作。这相对简单:编写一个过滤器,保持元素完整,并用加密的代码块替换所有文本节点。使用Base64将二进制加密数据转换为XML文本(确保仍然正确转义文本)

当最有价值的信息在文本块中时,这种方法非常有效。但是一些XML文档还在属性中保留重要数据。要解决此问题,请使用新的
元素替换所有此类属性。原件:

 <a foo="Important text">...
。。。
加密:

 <a><attr name="foo">...encrypted value of foo....</attr>...
…foo的加密值。。。。。。。

这样,您就可以在两种表单之间进行转换,而不会丢失数据。

那么您想要的正是Apache Santuario的功能,但不想使用Apache Santuario?听起来。。。棘手的另外:我不明白他们为什么不选择Santuario。不,我想以一种通用的方式使用Java提供的东西。无论如何,ApacheSantuario是第三方API。如果我们这样做会更好,使用Java可能是标准的方式,以便其他语言可以轻松地做到这一点。我们的目的不是像Santuario那样开发我们自己的api,而是使用Java中已有的api。Java中没有现成的api来实现这一点。您要么使用第三方库,要么再次编写Santuario。它是Java的核心功能之一,可以保持运行时的精简(嗯,是的,我知道…大部分),并添加任何额外的功能,以及您可以选择的库。“如果我们使用Java这样做会更好,这可能是标准的方式”-在Java中,它是使用第三方API的标准,实际上是一个开源API来引导。拒绝第三方API就是不讨好Java。Santuario实现了官方标准,所以它没有比这更官方的了,我真的不明白你期望什么。JDK不能(也不应该)提供所有现成的功能。10年后,当(可能)XML加密被广泛使用时,它可能会进入JDK(也可能不会),这是我解析每个元素并加密内容的最后选择。但是黑客可以很容易地猜出标签名。与sdj344&*5%$一样,它表示标记包含有关工资的信息。有人可以绕着它玩。如果我可以从标签中加密就更好了。对不起,但是构建自己的加密方案肯定会失败。编写良好的加密(无论是协议、密码还是PRNG)都很困难。而且有很多棘手的方法让它出错。所以,请,请,不要试图发明自己的加密方案*@用户2688934:请仔细阅读。如果您的加密无法防止这种情况,那么整个方案只会感觉安全,但不会安全。但是如果您真的想浪费更多时间:创建文档中所有XML元素名称的列表,创建一个映射,该映射将实名转换为
e0
e1
。。。并将该映射放在文档开头的一个新XML元素中,然后接收者可以解码缩短的名称。我只想知道Java6是否提供了用于XML加密和解密的API。如果不可能,我将不得不考虑其他选择。请用具体的答案帮助我解决问题。