使用.NET SignedCms为已有哈希生成CMS格式签名的参数配置问题
1. contentType的OID值配置
你需要传入PKCS#7规范定义的通用数据类型OID:1.2.840.113549.1.7.1,这个OID对应id-data类型,适合承载任意二进制内容,你这里的SHA1/SHA256哈希字节可以直接用这个类型封装。
2. detached参数是否必须设为true
不是强制要求,该参数的作用是控制签名结构是否嵌入原始内容:
- 设为
true:生成分离式签名,最终输出的签名数据不包含你传入的哈希字节,后续验证签名时需要额外提供原始哈希值才能完成校验 - 设为
false:生成封装式签名,哈希字节会被嵌入到签名结构中,后续验证时无需额外提供原始内容,可直接从签名结构中读取
你可以根据自己的业务场景选择即可。
修正后的代码示例
// 配置为id-data对应的OID var contentType = new Oid("1.2.840.113549.1.7.1"); var content = Convert.FromBase64String(hash); // 支持SHA1或SHA256哈希字节 var contentInfo = new ContentInfo(contentType, content); // 根据需求选择detached参数值,示例用分离签名 var signedCms = new SignedCms(contentInfo, detached: true); var signer = new CmsSigner(certificate); signedCms.ComputeSignature(signer); var signature = signedCms.Encode();
额外注意事项
如果你的需求是直接对现有哈希做签名、避免SignedCms对传入的哈希字节二次计算哈希,可以在初始化CmsSigner时显式指定哈希算法,配合对应重载跳过内容哈希步骤,你当前的写法如果是把哈希本身当作待签名的内容,不需要做额外调整。
内容的提问来源于stack exchange,提问作者D.R.
相关产品推荐
相关产品推荐

