数字签名(英文:Digital Signature)类似于我们写在纸上的手写签名,它的诞生主要是为了解决如下问题:
1. 证明该文件(或信息)是由你发送的。
2. 证明该文件(或信息)没有被他人篡改过。
其实,我们生活中手写签名的纸质合同也是通过各种形式达到上面2个效果(如:合同一式多份,每份合同都有双方签名等)。
数字签名利用了《对称与非对称加密算法》中介绍的“非对称加密算法”,签名和验证签名的过程如下图(图中的“认证”部分不是数字签名必须的,在“数字证书”部分会介绍):
假设“李四”要发送一份数据给“张三”:
发送者“李四”对数据生成摘要信息(摘要明文A),然后使用“李四”的“私钥”加密摘要信息;接收者“张三”收到加密的摘要信息之后:
通过上面的过程我们可以知道:
1. 数字签名具有合法性的前提条件是用于加密散列值的“私钥”没有被泄露。
2. 数字签名不负责数据的加密,若要防止数据被他人窥视,则还要结合其他手段,如使用接收者的“公钥”对数据进行加密等。
如何获取签名者的公钥?如何保证获得的公钥就是签名者的,而不是他人的?基于这些问题,数字签名需要结合后面介绍的数字证书来使用(也就是上图中的“认证”文件)。
有了上面的公开密钥算法(也就是“非对称加密算法”)之后,我们就可以通过他人的公开密钥(公钥)与其安全通信了,但是还有一些悬而未决的问题:
公钥基础设施(public key infrastructure, 简称KPI)就是为了解决这个问题而建立的。PKI的目标就是为了实现不同成员在不见面的情况下进行安全通信的,我们当前采用的PKI模型是基于可信的第三方机构,也就是“证书颁发机构”(certification authority,简称CA)签发的证书。证书中存储了使用“证书颁发机构”的私钥加密之后的申请者的公钥信息。
2.1 数字证书的申请
数字证书需要向“证书颁发机构”提交申请,并通过审核之后才能颁发。因为数字证书中存储的是申请者的公钥,所以如果申请者的私钥丢失或泄漏,就需要向“证书颁发机构”申请注销该证书。
Web服务器向CA申请证书的流程大致如图:
“证书”中主要包含了经过“证书颁发机构”的私钥加密过后的申请者的“公钥”、“证书有效期”、“申请者信息(如域名等)”。更详细的信息,可以参考《HTTPS权威指南》 第3.3.1章节。
2.2 数字证书的验证
以“Chrome浏览器”为例:
浏览器会内置各大著名的“证书颁发机构”的“公钥”,当收到Web服务器返回的“服务器证书”后,Chrome会尝试使用内置的该“证书颁发机构”的“公钥”来解密该证书,如果能解密则说明该证书是“证书颁发机构”颁发的,且没有被篡改过的。然后通过解密所得的“域名”、“证书有效期”来校验该证书是否为该网站所有,是否过期等。
联系客服