同样学自《阮一峰的网络日志》,大牛也是学自另外一个大牛的文章《What is a Digital Signature?》。
这篇笔记用简单的图文讲解什么是数字签名,什么是数字证书,读完后至少对这个过程清楚了很多,记录一下(文字条理来自阮一峰,图片来自原文)。
下面是基础原理部分:
1. Bob 有两把钥匙,一把叫做公钥,一把叫做私钥。
2. Bob 把公钥给了他的朋友们,Pat、Doug、Susan 每人都有一把。
3. Susan 想给 Bob 写一封密信,用 Bob 的公钥进行加密即可。而 Bob 用私钥进行解密。只要 Bob 的私钥不泄漏,别人就无法打开 Susan 的这封密信。
4. Bob 给 Susan 回信,为了说明这封信就是自己写的,好比皇帝下的圣旨必须得有玉玺加印一样:
1)第一步,Bob 对回信内容进行 Hash 计算,生成 Digest(摘要)。这里要说明一下,一旦有人篡改了信件内容,Hash 算法保证了摘要一定会发生变化,而且也不可能通过摘要推算信件内容。
2)第二步,Bob 用私钥对这个摘要进行加密,生成了数字签名。
3)第三步, Bob 把数字签名添加到信件上,好比增加一句 “此致,XXX敬上”。
4)第四步,Bob 把签了名的信件发送给 Susan。
5)第五步,Susan 收到信件后,用 Bob 的公钥解密数字签名,成功得到信件摘要,证明此信件确实源自 Bob。同时,Susan 也可以对信件内容再进行 Hash 计算得到一份摘要,对比两份摘要,如果内容完全一致,证明信件内容没有被篡改过。
上面讲的是一个正常过程,也就是没有那么多坏心眼和恶作剧的时候。那么,问题来了,如果 Doug 想假冒 Bob 和 Susan 通信怎么办?
5. Bob 可能会偷偷使用 Susan 的电脑,将 Bob 的公钥换成自己的公钥。而 Susan 没有发觉使用的公钥已经是 Doug 的了,而 Doug 就用自己的私钥进行上述的数字签名过程,伪装 Bob 与 Susan 进行通信,抱得美人归。
6. 而 Susan 终于发现事情不对劲,感觉自己使用的公钥有问题,于是她想到一个办法,希望 Bob 能够到一个权威机构对自己的公钥进行公证,这个权威结构也就是“证书中心(Certificate Authority,简称CA)”。证书中心于是用自己的私钥,对 Bob 的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
7. Bob 拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。而 Susan 收到信件后,也先用 CA 的公钥解开数字证书,拿到经过认证的公钥,再用这个公钥去验证数字签名,以此来确认是否真的来自 Bob。
下面是 HTTPs 的例子:
HTTPs 用于网页加密,是数字证书的实际应用案例。
1. 客户端向服务器发出访问加密网页的请求
2. 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
3. 客户端浏览器的"证书管理器"包含有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
4. 如果数字证书记载的网址,与你正在浏览的网站不一致,就说明这张证书可能被冒用,浏览器会发出警告。这种情况,可能是你浏览的网站太穷太懒,没有去申请自己的证书;也可能真的是有问题的网站。
5. 当然,如果这张数字证书不是由受信任的机构颁发的(世界是自由的,你也有权利做认证机构),浏览器会发出另一种警告。
6. 如果数字证书是可靠的,客户端就可以使用证书中携带的服务器公钥,对信息进行加密,然后与服务器交换加密信息。