我尝试使用数字签名验证MS Word * .docx文件。为了进行验证,我必须计算引用节点的摘要并检查它是否与签名(sig1.xml)中给出的相同。我无法找到关于如何实现关系转换以便计算摘要的信息。
签名XML(sig1.xml)的部分如下:
<Object Id="idPackageObject" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature">
<Manifest><Reference URI="/_rels/.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml">
<Transforms><Transform Algorithm="http://schemas.openxmlformats.org/package/2006/RelationshipTransform">
<mdssi:RelationshipReference SourceId="rId1"/></Transform>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>1vWU/YTF/7t6ZjnE44gAFTbZvvA=</DigestValue>....(next ref node ....)..
<Reference URI="/word/document.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>s2yQEJrQSfC0YoRe1hvm+IGBpJQ=</DigestValue></Reference>.....More Reference Nodes.....
/ _ rels / .rels文件自己:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin" Target="_xmlsignatures/origin.sigs"/>
</Relationships>
所以我需要计算/_rels/.rels的SHA1,但在计算之前我必须应用关系变换和C14N。
当我计算没有关系变换的节点的摘要时(例如,该节点):
<Reference URI="/word/document.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>s2yQEJrQSfC0YoRe1hvm+IGBpJQ=</DigestValue>
</Reference>
一切都很好,只是做了引用URI的SHA1(在这种情况下是/word/document.xml)给出了与签名节点中给定的哈希相同的哈希值。但是当谈到具有关系变换的节点时 - 计算永远不会给出签名中所述的相同值。
我的问题一般是在哪里可以找到关于这种关系变换以及如何实现它的信息?
谢谢,
的Georgi
答案 0 :(得分:4)
在这种情况下,关于转换和关系转换的主要信息来源可以在ECMA&#34; Office Open XML文件格式 - 开放式打包协议&#34中找到;纸。链接here。
重要部分是13.2.4.24。
Relationship Transform应该创建.rels文件的副本,在这种情况下&#34; / _ rels / .rels&#34;并删除与 SourceId 不匹配的所有 Relationship 节点。该文件最终被散列并创建摘要。
包实现者应删除没有 Id值的所有Relationship元素 匹配任何SourceId值或匹配任何SourceType值的Type值 在转换定义中指定的SourceId和SourceType值。
在第3步,&#34;准备规范化&#34;它还说:
软件包实现者应添加 TargetMode 属性及其默认值,如果这是可选的 关系元素
中缺少属性
因为我们在同一个包中创建文件之间的关系,所以我们的值为&#34; 内部&#34;。您需要在散列之前添加此属性。
所以在变换和c14n之后,你应该有:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Target="word/document.xml" TargetMode="Internal" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"></Relationship></Relationships>
注意:如果您使用的是unix系统,请注意换行符,OPC使用CRLF而非LF。