岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> 其他技术 >> Java正文
Java SE 6中XML数字签名标准Java接口
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-23 9:51:47
ationMethod.INCLUSIVE_WITH_COMMENTS, (C14NMethodParameterSpec) null); 2. SignatureMethod dsa_sha1SigMethod = fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null); 3. SignedInfo signedInfo = fac.newSignedInfo(c14nWithCommentMethod, dsa_sha1SigMethod, Collections.singletonList(refToRootDoc));

    因为最终的数字签名是针对 <SignedInfo> 元素而生成的,所以需要指定该 XML 元素的规范化方法,以确定最终被处理的数据。这里指定为 INCLUSIVE_WITH_COMMENTS , 表示在规范化 XML 内容的时候会将 XML 注释也包含在内。

    至此,待签名的内容(<SignedInfo> 元素)已指定好,再只需要签名所使用的密钥就可以创建数字签名了。

4. 创建密钥对

    XML 数字签名规范规定了多种在 <KeyInfo> 中指定验证密钥的方式,比如 <KeyName><KeyValue><X509Data><PGPData> 等等。这里使用 XML 数字签名规范规定必须实现的 <DSAKeyValue> 来指定验证签名所需的公共密钥。在程序中使用 java.security 包生成 DSA 密钥对。

首先创建密钥对:

 1.	KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA");

 2.	kpGen.initialize(512);

 3.	KeyPair keyPair = kpGen.generateKeyPair();

	

然后以公钥为参数创建 <KeyValue> 元素:

 1.	KeyInfoFactory keyInfoFac = fac.getKeyInfoFactory();

 2.	KeyValue keyValue = keyInfoFac.newKeyValue(keyPair.getPublic());

	

根据创建好的 <KeyValue> 元素创建 <KeyInfo> 元素:

	

	1.	KeyInfo keyInfo =

           keyInfoFac.newKeyInfo(Collections.singletonList(keyValue));

	

    这里创建的密钥对,其中的公钥已经用于创建 <KeyInfo> 元素并存放在其中,供签名验证使用,而其中的私钥则会在下一步被用于生成签名。

5. 创建 <Signature> 元素

    前面已经创建好 <SignedInfo><KeyInfo> 元素,为了生成最终的数字签名,需要根据这两个元素先创建 <Signature> 元素,然后进行签名,创建出 <SignatureValue> 元素。

 1.	XMLSignature signature = fac.newXMLSignature(signedInfo, keyInfo);	

	

   XMLSignature 类中的 sign 方法用于对文档进行签名,在调用 sign 方法之前,还需要创建 DOMSignContext 对象,为方法调用提供上下文信息,包括签名所使用的私钥和最后生成的 <Signature> 元素所在的目标父元素:

 1.	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

 2.	dbf.setNamespaceAware(true);

 3.	Document doc = 

      dbf.newDocumentBuilder().parse(new FileInputStream(args[0]));

4.	DOMSignContext dsc = 

       new DOMSignContext(keyPair.getPrivate(), doc.getDocumentElement());	

	

    这里首先使用 JAXP 的 DOM 接口将待签名文档解析,然后根据前面创建的私钥和待签名文档的根元素创建 DOMSignContext 对象。

    请注意,到这里为止都只是创建各种生成签名所需数据的 XML 元素表示,并没有开始真正地生成数字签名。

6. 最后一步,生成签名

 1.	signature.sign(domSignCtx);	

	

    sign 方法会生成签名值,并作为元素值创建 <SignatureValue> 元素,然后将整个 <Signature> 元素加入为待签名文档根元素的直接子元素。

7. 输出签名后的文档

数字签名生成之后,使用 JAX P的 XML 转换接口将签名后的 XML 文档输出,查看签名结果:

 1.	Tr

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365