签名数据Signed Data的组成涉及到以下几个步骤
步骤一
- 对于每个签名者, 消息摘要是用签名者指定的消息摘要算法对指定内容作摘要计算生成的数据。
- (若两个签名者使用同一种摘要算法, 则只需为其中一个做摘要即可。)
- 若签名者要验证内容以外的信息, 则用签名者指定的摘要算法对内容摘要和其他信息再做摘要, 生成的结果也是消息摘要。
步骤二
- 对于每个签名者, 用签名者是私钥对消息摘要和相关的信息加密, 得出签名结果。
步骤三
- 对于每个签名者,签名和签名者相关的信息被收集到SignerInfo数据结构当中。
- 每个签名者的证书和证书撤销列表, 以及那些不对应任意一个指定签名者的, 被收集到这一步。
步骤四
- 所有签名者的消息摘要算法和所有签名者的SignerInfo数据结构, 它们的内容被收集到SignedData数据结构当中。
步骤完。
步骤一实际上规定了摘要的生成。
说明了对于相同的内容用相同的摘要算法做摘要, 结果是一样的。
可以只对内容作摘要, 也可以把摘要和其他信息放在一块再做一次摘要。
步骤二规定了签名。签名可以是只对摘要加密, 也可以是对摘要和其他信息的融合再加密。
步骤三和步骤四说明了SignedData的格式。
PKSC#7中的SignedData的格式如下
版本 | Version |
摘要算法集合 | DigestAlgorithmIdentifiers |
内容信息 | ContentInfo |
证书[可选项] | ExtendedCertificatesAndCertificate |
证书撤销列表[可选项] | CertificateRevocationLists |
证书标识 | IssuerAndSerialNumber |
摘要算法 | DigestAlgorithmIdentifier |
已验证属性[可选项] | authenticatedAttributes |
签名算法 | DigestEncryptionAlgorithmIdentifier |
签名 | EncryptedDigest |
未验证属性[可选项] | unauthenticatedAttributes |
绿色背景的表示SignerInfo数据结构, 包含了签名者相关的信息, 包括
- 证书标识, 用来查找相应的公钥证书;
- 摘要算法, 用来对原文作摘要, 再跟从签名中解密出来的摘要比较构成验签的最后一步;
- 签名算法, 用来解密签名;
- 签名, 用来获取摘要;
遵循PKSC#7中的SignedData格式的签名结果, 能够很好地组织验签。