我有 CMS(基于 PKCS#7)签名作为输入,我想从中创建等效的 xmldsig。我可以从 CMS 消息中提取 X509 证书,但我看不到如何提取签名哈希(在 xmldsig 字段中重用)。有没有办法从 CMS 消息中提取签名哈希?
问问题
132 次
1 回答
1
我有 CMS(基于 PKCS#7)签名作为输入,我想从中创建等效的 xmldsig。
您不能将 CMS SignedData 转换为 XmlDSig SignedXml,它们签署的不是同一件事。
CMS SignedData 对原始数据(不存在签名属性时)或签名属性(存在时必须包含原始数据的正确哈希作为属性)进行签名。
XmlDSig SignedXml 在规范化的 SignedInfo 元素上使用签名。SignedInfo 元素包含原始数据的散列(摘要)作为其有效负载的一部分。
如果您拥有私钥并且知道您需要在手动构建 SignedInfo 值后辞职,那么我们会进入您问题的最后一部分:
有没有办法从 CMS 消息中提取签名哈希?
我不确定“签名哈希”是什么意思。如果您的意思是“原始数据的哈希”,那么在 SignedCms 中会类似于
byte[] digest = cms.SignerInfos[0].SignedAttributes.OfType<CryptographicAttributeObject>().
FirstOrDefault(cao => cao.Oid.Value == "1.2.840.113549.1.9.4")?.Values.
OfType<Pkcs9MessageDigest>().FirstOrDefault()?.MessageDigest;
if (digest == null)
{
// Older form document, have to hash the original data again.
throw new NotImplementedException();
}
一旦找到正确的 OID,可能会减少对 Linq 扩展方法的调用和/或更多关于正确性的断言。
于 2020-04-20T18:02:49.727 回答