CMS签名 - 时间戳和会签有什么区别

本文关键字:什么 区别 签名 时间戳 CMS | 更新日期: 2023-09-27 17:56:10

我正在尝试使用BouncyCastle在C#中为数字签名(带有本地时间戳证书)。我对时间戳的理解是,它是对当前时间进行签名。不确定应该是当前时间+原始签名内容吗?也请帮忙。

我的主要困惑是是否将生成的时间戳添加到原始签名的唱/无符号属性中。或者它将被添加为副签名?

CMS签名 - 时间戳和会签有什么区别

时间戳的目标是证明签名是在给定时间之前创建的,因此使用时间戳时,您必须对数字签名和当前时间进行签名。时间戳必须作为未签名属性添加到 CMS 签名中。除了SignatureTimeStampToken本身就是一个签名。

要向 CMS 添加时间戳,您可以使用签名时间戳属性,该属性具有 1.2.840.113549.1.9.16.2.14 对象标识符并具有 ASN.1 类型(以下信息均摘自 CMS 和 TSP RFC)

SignatureTimeStampToken ::= TimeStampToken
TimeStampToken ::= ContentInfo
 -- contentType is id-signedData ([CMS])
 -- content is SignedData ([CMS])
 
SignedData ::= SEQUENCE {
    version CMSVersion,
    digestAlgorithms DigestAlgorithmIdentifiers,
    encapContentInfo EncapsulatedContentInfo,
    certificates [0] IMPLICIT CertificateSet OPTIONAL,
    crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
    signerInfos SignerInfos }

在 TimeStampToken 中,SignedData 构造的 EncapsulatedContentInfo 类型的字段具有以下含义:

eContentType 是唯一指定内容类型的对象标识符。 对于时间戳令牌,它定义为:

    id-ct-TSTInfo  OBJECT IDENTIFIER ::= { iso(1) member-body(2)
    us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) ct(1) 4}

eContent 是内容本身,作为八位字节字符串携带。电子内容应为TSTInfo的DER编码值。

时间戳令牌不得包含 TSA 签名以外的任何签名。 TSA 证书的证书标识符 (ESSCertID) 必须作为签名证书属性中的 signerInfo 属性包含在 SigningTCertificate 属性中。

    TSTInfo ::= SEQUENCE  {
       version                      INTEGER  { v1(1) },
       policy                       TSAPolicyId,
       messageImprint               MessageImprint,
             -- MUST have the same value as the similar field in
             -- TimeStampReq
       serialNumber                 INTEGER,
            -- Time-Stamping users MUST be ready to accommodate integers
            -- up to 160 bits.
       genTime                      GeneralizedTime,
       accuracy                     Accuracy                 OPTIONAL,
       ordering                     BOOLEAN             DEFAULT FALSE,
       nonce                        INTEGER                  OPTIONAL,
             -- MUST be present if the similar field was present
             -- in TimeStampReq.  In that case it MUST have the same value.
       tsa                          [0] GeneralName          OPTIONAL,
       extensions                   [1] IMPLICIT Extensions   OPTIONAL  }

希望这有帮助,