数字签名是什么?

929 阅读3分钟

公钥用来加密信息,私钥用来数字签名。

  1. 服务器有两把钥匙,一把是公钥,另一把是私钥

    服务器把公钥发送给每个客户端。

    数字签名是什么?.md 2019-09-08 21-13-58.png

  2. 客户端发送消息

    客户端向服务器发送消息,将消息用公钥加密。

    服务器收到消息后,用私钥解密,获取消息内容。

    数字签名是什么?.md 2019-09-08 21-53-03.png

    服务器私钥不泄露,就是安全的,即使消息被他人窃取,也无法解开。其实一般情况下,私钥也不会泄露。

  3. 服务端发送消息:数字签名(即私钥加密)

    服务器给客户端回复消息,

    • Hash 函数生成消息的摘要(digest)。
    • 私钥对摘要进行加密,生成 “数字签名”。

    未命名文件.png

    服务器将 数字签名 ,附在消息下面,一起发给客户端。

    未命名文件 (1) 下午11.29.36.png

  4. 客户端解密

    客户端收到消息后。

    • 取下数字签名,用服务器的公钥解密,得到消息的摘要。(可以解密,证明消息是服务器发出的)
    • 再对消息本身使用 hash 函数,将得到的结果与上一步的摘要比对。(两者一致,就证明未被修改过)

    未命名文件.png

数字证书

通过以上示例,信息交换很安全,那么为什么还需要 “数字证书(Digital Certificate)” 呢?

假设小明偷偷使用了你的电脑,用他自己的公钥换走了真实服务器的公钥。此时你的电脑实际拥有的是小明的公钥,但还以为是服务器的公钥。因此,小明就可以冒充服务器,用自己的私钥做成“数字签名”,发送消息给你,你会误用小明的公钥解密。后来你感觉不对劲,发现自己无法确定公钥是否真的属于真实服务器。

那么如何才能证明 公钥 是真实服务器的呢?

1. 数字证书

服务器可以找“证书中心(certificate authority,简称CA)”,为公钥做公证。

证书中心(CA)用自己的私钥,对服务器的公钥和一些相关信息一起加密,生成“数字证书(Digital Certificate)”。

未命名文件.png

2. 附加数字证书

服务器拿到数字证书以后,再给客户端发送消息,只要在签名的同时,再附上数字证书就行了。

未命名文件 (1).png

3. 客户端获取真实公钥

客户端收到消息后,用CA的公钥解开数字证书,就可以拿到服务器的真实公钥了,然后就能证明“数字签名”是否真的为真实服务器所签。

未命名文件 (2).png

CA都是一些可靠的大机构,它们的公钥在自己网站上提供下载,所以无法伪造。

实例应用

这里我们看一个“数字证书”的实例:https协议。这个协议主要用于网页加密。

bg2011080914.jpg

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

钥匙串访问 2019-09-09 11-07-30.png

非法警告

  1. 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

    bg2011080918.png

  2. 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

    bg2011080919.jpg

参考

  1. 数字签名是什么? by 阮一峰