目录
1. 什么是数字签名?
数字签名是电子签名技术的一种。
大多数应用场景提到的电子签名,实际指的就是数字签名。由于保持技术中立性是制订法律的一个基本原则,基于公钥密码理论的数字签名技术未必是可靠电子签名的唯一技术,因此法律上会使用更广义的概念以适应今后的技术发展。
数字签名背后的思想是模仿传统手写签名,该思想是能够以某种方式"签署"一份数字文档,该签名具有物理签名一样的法律效力。与物理世界中的手写签名相对应,数字签名可以理解为数字世界的电子签名。
简单地说,就是实现签名人身份真实、签署后的文档不可修改、签署行为不可抵赖。数字签名技术是目前最符合可靠电子签名要求、应用最普遍、可操作性最强的技术之一。
数字签名是公钥加密技术(也称为非对称加密)与数字摘要技术(也称为散列算法或哈希算法)相结合的应用。基于公钥加密技术,每个证书持有人都有一对公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,不需要保密,而私钥是由证书持人自己持有,并且必须妥善保管和注意保密。结合使用公钥技术与散列算法来创建数字签名,可用作数据完整性检查并提供拥有私钥的凭据。
2. 数字签名的主要功能
数字签名目前只能使用非对称密码算法实现。
数字签名的主要功能包括:
- 接收方能够确认发送方的签名,但不能伪造。
- 发送方发出签过名的信息后,不能再否认。
- 接收方对接收到的签名信息也不能否认。
- 一旦发送方和接收方出现争执,仲裁者可有充足的证据进行审判。
由此可知,数字签名的主要作用:保证信息传输的完整性、发送者的身份认证、 防止交易中的抵赖发生
3. 数字签名和验签的原理
3.1 数字签名和验签的步骤流程
- 信息发送者使用摘要算法对源文件data处理生成数字摘要值 A。
- 信息发送者使用自己的私钥sk对摘要值A进行签名(加密的过程)signatureData。
- 信息发送者把原文data和签名值signatureData一起发送出去。
- 信息接收者使用相同的摘要算法对接收到的原文data进行摘要计算,得到新的摘要值B。
- 信息接收者使用信息发送者的公钥pk对签名值signatureData进行验签(解密的过程),获得信息发送者的摘要值A。
- 信息接收者比较这两个摘要值A和B是否相同,如果相同则确认信息发送者的身份和原文信息没有被修改过;否则,表示原文信息已经被修改过。
整个签名和验签流程如下图所示:

签名人的数字证书是由证书颁发机构(CA)验证申请者真实身份后颁发,证书绑定申请者真实身份信息,可验证签名者身份真实性;数字签名后,数据一旦被修改,数字签名立即失效,接受方即可发现签署后的数据已经被修改,无法在不被发现的情况下修改数据;证书私钥由证书持有者在自己本地生成的,由证书持有者自己负责保管,可确定为签名人专有,签署行为不可抵赖。
此外,《电子签名法》第16条规定,电子签名需要第三方认证的,由依法设立的电子认证服务提供者提供认证服务。
3.2 数字签名的制作和验证过程

上图已经很清晰的概括了数字签名验签的过程。我们有个疑问:为什么要对消息摘要进行数字签名,而不是对消息直接进行数字签名呢?
签名的本质是利用私钥对消息摘要进行加密。因为签名也属于公钥密码体制,它也是模指数运算,因而,计算机效率特别低,若消息长到一定程度,根本无法计算。为解决这一问题,就计算消息摘要,因为消息摘要的长度约为 200 多比特左右,而且是固定长度(无论消息多长,其不同摘要算法对应的摘要值长度都是固定的),这一长度,是公钥密码体制可接受的范围。因此,在签名中,都是对消息的摘要进行签名。
3.3 RSA算法签名验签过程
RSA签名:
明文加上摘要算法运算得到摘要值,然后用摘要值加上签名算法在加上RSA私钥做非对称加密运算得到签名结果。
RSA验签:
明文加上摘要算法运算得到摘要值,然后用RSA公钥加签名算法对签名结果做非对称解密得到摘要值,最后对比两个摘要值的一致性。
3.4 SM2算法签名验签过程
SM2签名:
明文加上摘要算法和SM2公钥运算得到摘要值,然后摘要值加上签名算法和SM2私钥做非对称加密得到签名结果。
SM2验签:
明文加上摘要算法和SM2公钥运算得到摘要值,然后摘要值加上签名算法和SM2公钥做非对称加密得到签名结果,最后比较两个签名结果得一致性。
4. 签名分类
4.1 PKCS #1签名
- P1签名:签名结果中不带公钥证书和原文内容。
- P1签名也称为裸签名,因此在验签的时候,需要提供签名值、原文和签名证书三种数据。
PKCS #1 规范规定了使用RSA算法进行签名时摘要格式。摘要格式用ASN.1描述:
DigestInfo::=SEQUENCE{
digestAlgorithm DigestAlgorithm,
digest OCTET STRING
}
4.2 PKCS #7签名
- P7签名:分为Attach和Detach
- P7Attach签名:
将原文数据、签名证书、签名证书算法、签名数据封装成P7签名格式的数据结构。
因此,在验签的时候只提供签名结果就可以。
- P7Detach签名
将签名证书、签名算法、签名数据封装成签名数据。
注:没有原文信息,因此,在验签的时候不光提供签名结果,还要提供明文。
PKCS #7 和RFC2315 规范规定了使用数字签名消息的具体封装格式。数字签名消息封装格式用ASN.1描述:
SignedData::=SEQUENCE{
version Version,
digestAlgorithm DigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates[0] IMPLICIT ExtndedCertificatesAndCertificates OPTIONAL,
crls[0] IMPLICIT CertificatesRevocationLists OPTIONAL,
signerInfos SignerInfos
}
4.3 算法分类
- 常见对称加密算法:DES、3DES、AES、SM1、SM4
- 常见非对称加密算法:RSA、SM2、ECC
- 常见摘要算法:MD5、SHA1、SHA256、SM3
5. 数字信封
5.1 什么是数字信封?
对称密码算法的优点是加解密运算非常快,适合处理大批量数据,但其密钥的分发与管理比较复杂。而非对称密钥算法的特点是公钥与私钥分离,非常适合密钥的分发与管理;但其运行速度不快,又不适合处理大批量数据。
如果将对称密码算法和非对称密码算法的优点结合起来,则既能处理大批量数据,又能简化密钥分发与管理,于是数字信封机制应运而生。
数字信封并不需要分发和管理对称密钥,而是随机产生对称密钥,采用对称密码算法对大批量数据进行加密,并采用非对称密钥算法对该对称密钥进行加密;解密时,先用非对称密码算法解密后获得对称密钥,然后再使用对称密码算法解密密文数据后获得数据明文。
数字信封的功能类似于普通信封,采用对称密码算法对消息进行加密类似于信纸上的内容,采用非对称密码算法对对称密钥加密类似于外层的信封,信封将信纸包装起来,保证了消息的安全性。
对上述进行总结,我们知道数字信封是将对称密钥通过非对称加密(即:有公钥和私钥两个)的结果分发对称密钥的方法。数字信封是实现信息完整性验证的技术。
5.2 数字信封机制的具体流程
数字信封机制的具体流程如下:
- 消息发送方A和消息接收方B需要预先交换对方的非对称公钥。
- 消息发送方A随机产生对称密钥,并用该密钥和对称算法对消息进行加密。
- 消息发送方A用消息接收方B的公钥和非对称算法对上述对称密钥进行加密.
- 消息发送方A将消息密文和对称密钥密文一起发送给消息接收方B。
- 消息接收方B收到消息密文和对称密钥密文。
- 消息接收方B使用自己的私钥和非对称算法解密对称密钥密文后,获得对称密钥明文。
- 消息接收方B使用上述对称密钥和对称算法对消息密文进行解密后,获得消息明文。
数字信封的生成和解开过程如下图所示:

PKCS #7 规范定义了数字信封消息的具体封装格式。数字信封消息封装格式用ASN.1描述如下:
EnvelopeData::=SEQUENCE{
version Version,
recipientInfos RecipientInfos,
encryptedContentInfo EncryptedContentInfo
}
RecipientInfos::=SET OF RecipientInfos
EncryptedContentInfo::=SEQUENCE{
contentType ContentType,
contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
encryptedContent[0] IMPLICIT EncryptedContent OPTIONAL
}
5.3 签名 、数字信封、证书的关系
三者没有任何的关系!!它们三个的作用是不同的。
- 签名:为了验证身份的;
- 信封:为了传输信息的;
- 证书:承载公钥和发布者一些信息的。
他们作用不同,所以没有必然的联系!!!