使用 SignedCms 计算数字签名 class

Compute digital signature using SignedCms class

我正在使用 .NET Framework 中包含的 ContentInfo、SignedCms 和 CmsSigner classes 对一些数据进行签名。签名遵循 CAdES 标准。

根据文档,当在 CmsSigner.SignedAttributes 集合中添加至少一个签名属性时,CmsSigner class 会自动生成 contentType 和 messageDigest 签名属性。在我的代码中,我按以下顺序添加了 2 个签名属性:signing-certificate-v2 和 signature-policy-identifier。

当我检查生成的 PKCS#7 对象时,签名属性按以下顺序出现:signature-policy-identifier、contentType、messageDigest 和 signing-certificate-v2。

是否可以控制属性的顺序?我需要的顺序是contentType, messageDigest, signing-certificate-v2, signature-policy-identifier.

这很可能不是您期望的答案,但是当您查看 RFC5652 时,您会发现 SignedAttributes 被定义为 SET OF 而不是SEQUENCE OF:

SignedAttributes ::= SET SIZE (1..MAX) OF Attribute

当您查看 A Layman's Guide to a Subset of ASN.1, BER, and DER 时,您会发现这两者之间的区别:

SET OF - 无序 零次或多次出现的给定类型的集合
SEQUENCE OF - 有序 给定类型的零次或多次出现的集合

总结一下 => RFC5652 指出 CMS 结构中的签名属性是无序的 => 它们的顺序无关紧要。