是否有一种标准定义的方式来处理签名XML内容中的版本控制? 为了弄清楚我想做什么,这是我解决问题的方法:
<root>
<Data vid="1">
<value>123</value>
...
</Data>
<Misc vid="1">
<value>smthng</value>
</Misc>
<Sigature>
<SignedInfo>
<Reference ref="//root/Data[@vid = '1']">
<DigestValue>F234D=</Digestvalue>
</Reference>
<Reference ref="//root/Misc[@vid = '1']">
<DigestValue>12dA5=</Digestvalue>
</Reference>
</SignedInfo>
<SignatureValue>2828282=</SigantureValue>
</Signature>
</root>
如果我现在更改数据,请将<Data vid="1">
替换为<Data vid = "2">
并附加另一个Siganture,如下所示:
<root>
<Data vid="2">
<value>CHANGED</value>
...
</Data>
<Misc vid="1">
<value>smthng</value>
</Misc>
<Sigature>
<SignedInfo>
<Reference ref="//root/Data[@vid = '1']">
<DigestValue>F234D=</Digestvalue>
</Reference>
<Reference ref="//root/Misc[@vid = '1']">
<DigestValue>12dA5=</Digestvalue>
</Reference>
</SignedInfo>
<SignatureValue>2828282=</SigantureValue>
<Keyinfo />
</Signature>
<Sigature>
<SignedInfo>
<Reference ref="//root/Data[@vid = '2']">
<DigestValue>F234D=</Digestvalue>
</Reference>
</SignedInfo>
<SignatureValue>282AFDE82=</SigantureValue>
<Keyinfo />
</Signature>
</root>
我可以在我的代码中通过评估两个签名来保护数据和杂项的完整性,但忽略了无法解决的引用,在这种情况下 // root / Data [@vid ='1']无法检查,因为它不再存在。
简单地辞去所有内容是不可能的,因为必须清楚,谁是最后一个更新签名数据的哪一部分。 如果仅更新数据(例如,未经许可更新或读取杂项的客户端),则只能通过新签名对数据进行签名,必须保留旧签名以识别misc的最后一个编辑器。
SignedInfo和Reference TAG有一个可选的Attribute id,用于在XML文档的其他地方引用它们,因此不应该回收它们用于版本控制。
我提出的另一个想法是根本不使用ID,只检查所有签名,确保对于多次签名的引用,至少有一个签名有效。
如何正确完成/ W3C希望如何完成?