科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JavaSE 6基于JSR105的XML签名之实践篇

JavaSE 6基于JSR105的XML签名之实践篇

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们分析了有关基于JSR-105进行XML签名的基本概念。在本篇中,我们开始分析一个实际的XML签名示例应用程序。

作者:朱先忠编译 来源:天极开发 2007年10月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共6页)

【步骤5】-获得签名私有密钥。

  在我们的示例中,我们展示了三种不同的方法来得到该私有密钥。在第一种方法中,我们调用我们的KeyStoreInfo类的getPrivateKey()方法来检索我们使用keytool创建的DSA类型私有密钥,并且把它储存在密钥存储文件-bizkeystore(前面的5.0情形)中。为了获得该私有密钥,我们还可以从bizkeystore中检索该KeyPair-通过调用KeyStoreInfo的getKeyPair()方法,然后调用KeyPair实例(5.1.2情形)的getPrivate()。另一方面,JCA提供了一个名字为KeyPairGenerator的类用于根据需要随时动态地创建一个KeyPair,这正是Sign.java中的情形5.1.1提到的情况。

  读者还应该注意,JSR-105允许通过一个KeySelector对象获得私有密钥。我们在下节讨论KeySelector时还要详细分析。

  【步骤6】创建一个KeyInfo对象。这一步是可选的,就象KeyInfo作为签名元素中的一个元素是可选的一样。在我们的示例的情形6.0下,我们使KeyInfo成为null;这样以来,可以完全从结果XML签名中忽略它。

  W3C建议和JSR-105定义RSA的KeyValues以及DSA类型for wrapping,respectively,RSA和DSA公共密钥,并允许它们成为KeyInfo的内容。我们的示例中的情形6.1从我们以前使用JDK keytool生成的公共密钥中创建一个KeyValue对象,并且把它放到一个KeyInfo对象。后面,当讨论我们的核心校验程序时,我们将看到它如何使用这样的一个KeyInfo对象来检索公共密钥以用于签名校验。

  在JSR-105中,我们通过调用一个KeyInfoFactory实例中的操作创建了KeyValue和KeyInfo对象。其中,KeyInfoFactory负责创建所有主要的与KeyInfo相关的对象-例如KeyName,KeyValue,X509Data等。我们可以以与我们在〖步骤1〗得到XMLSignatureFactory实例相同的方式得到一个KeyInfoFactory实例。我们的示例调用XMLSignatureFactory对象的getKeyInfoFactory()方法取得KeyInfoFactory实例。

  我们的示例的情形6.2将创建一个X509Data对象-使用我们以前借助于工具keytool从bizkeystore中导出的证书biz.cer,然后把这个对象作为内容放入一个KeyInfo对象中。再次,后面我们将讨论的核心校验程序将证明我们如何从这样的一个KeyInfo对象中取得用于签名校验的公共密钥。

  【步骤7】创建一个XMLSignature对象。在JSR-105中,XMLSignature接口为W3C中建议的签名元素实现了建模。我们已经在前面看到该签名元素的结构。为了创建一个XMLSiganture实例,我们可以在XMLSignatureFactory中调用下列两个方法之一:

public abstract XMLSignature newXMLSignature(SignedInfo si, KeyInfo ki);
public abstract XMLSignature newXMLSignature(SignedInfo si, KeyInfo ki,
List objects, String id, String signatureValueId).

  第二个方法中的id和signatureValueId参数将成为结果XML签名文档中的XML元素ID。在我们的示例中,该XML签名将拥有一个Object元素;因此,我们需要使用第二个工厂方法。

  【步骤8】实例化一个DOMSignContext对象,并且使用它注册私有密钥。XMLSignContext接口(DOMSignContext实现它)包含用于生成XML的上下文信息签名。

  DOMSignContext提供了几种形式的构造器-签名应用程序用来注册要使用的私有密钥,并且这也是我们的示例中所采用的方法。

  在继续讨论签名过程的最后步骤之前,我们需要指出XMLSignContext和DOMSignContext实例都可能包含特定于它们所使用的XML签名结构的信息和状态。该JSR-105规范中声明:如果一个XMLSignContext(或DOMSignContext)与不同的签名结构一起使用,那么,结果将是无法预料的。例如,我们不应该使用相同的XMLSignContext(或DOMSignContext)实例来签名两个不同的XMLSignature对象。

  【步骤9】签名。XMLSignature接口中的sign()操作实现签名XMLSignature。其实,该方法还实现若干操作,包括基于相应的digest方法计算所有引用的digest值,并且基于该签名方法和私有密钥计算签名值。该签名值被XMLSignature实例中的嵌入式SignatureValue类所捕获,而对XMLSignature实例的getSignatureValue()方法的调用将返回使用结果值填充的SignatureValue对象。

  在我们的签名程序的最后,我们把XMLSignature编排成一个XML文档-signature.xml。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章