1

我有 CMS(基于 PKCS#7)签名作为输入,我想从中创建等效的 xmldsig。我可以从 CMS 消息中提取 X509 证书,但我看不到如何提取签名哈希(在 xmldsig 字段中重用)。有没有办法从 CMS 消息中提取签名哈希?

4

1 回答 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 回答