前言
近期在查阅HTTP相关的资料时,发现了几篇不错的文章,对于我们理解HTTP/HTTPS很有帮助。接下来几周会陆续发布。今天带给大家的是一篇有故事情节的小短文,文中通俗易懂地介绍了数字签名及https证书的工作原理。希望大家有所收获。
从前有个小伙儿叫 Bob。他有两把密钥,一把是公钥,一把是私钥。
Bob的公钥可以给任何同事使用,但唯独私钥留作自用。密钥用于加密信息。信息加密处理后会变成一种“乱码”的状态。只有拥有相应密钥的人才能使它恢复原样。Bob的这两把密钥都可以加密数据。用其中一把密钥加密过的数据,只有用另一把密钥才能解密。
Susan (如下所示) 使用Bob的公钥加密了一则消息。只有Bob使用自己的私钥才可以解开这则消息。Susan的消息加密后,其他同事可以随便看,反正都是密文,没有Bob的私钥的话,谁也不知道原消息是啥。
在一些工具的帮助下,Bob可以使用自己的私钥给文档和其他数据添加数字签名。数字签名就好比是按的手印,是极难伪造的。此外,签名还能确保已签名的数据不被别人修改。
首先,为了在文档上进行签名,Bob 对文档内容进行"哈希"处理,将数据压缩成几行文本。我们称之为消息摘要。(无法通过消息摘要得到原始的数据)
然后,Bob将消息摘要用自己的私钥进行加密。加密后的摘要就是数字签名。
最后,Bob将数字签名添加到文档。这样就完成了对数据的签名。
现在,Bob将这个签名后的文档发给了Pat。Pat收到文档后,该怎么处理呢?
首先,Pat的使用Bob的公钥解密签名,将签名还原成消息摘要。如果能还原成功的话,则证明这个文档确实是Bob签名的,因为只有Bob拥有私钥。Pat随后将文档数据进行哈希处理,得到一段消息摘要。如果消息摘要与从签名中解出来的消息摘要相同,Pat就明白文档中的数据没有被别人修改。
这时剧本有了变化…
此时有一个满腹牢骚的员工 Doug 想算计Pat。在 Doug 的操弄下, Pat虽然收到了一个有签名的消息和一个看上去似乎是Bob的公钥。但Pat并不知道自己得到的公钥,是Doug冒用Bob的名字创建的假公钥。那么问题来了,如果Pat不是亲自从Bob手里取得的公钥,他怎么才能确保得到的公钥是真的呢?
恰巧,Susan在企业证书颁发中心工作。Susan可以对Bob的公钥及其他信息进行审查确认后,对Bob提供的信息进行签名认证。然后颁发一个数字证书。有了Susan颁发的证书,Pat就知道拿到的公钥是真的了。
现在,Bob的同事可以检查Bob的证书,确保他的公钥确实属于他。如果私钥被泄露或不再需要,Susan可以撤销签名。如果有人对Susan不信任的话,还可以找更权威的认证机构对Susan进行认证。
假设Bob将带有签名的文档发送给Pat。为了验证文档上的签名,Pat首先使用Susan(证书颁发机构)的公钥来检查Bob证书上的签名。如果能成功解密该证书,那么可以证明是Susan创建的该证书。证书解密后,Pat可以检查Bob的证书是否还在有效期,以及与Bob身份有关的所有证书信息是否都未更改。
然后Pat从证书中获取Bob的公钥,并使用它来检查Bob的签名。如果Bob的公钥成功地对签名进行了解密,则Pat可以确保签名是使用Bob的私钥创建。当然,如果签名有效,那么我们知道内容没有被Doug修改。
参考文献:http://www.youdzone.com/signature.html
推荐阅读
好文我在看👇