节点 A 将变长报文提取为定长的摘要 节点(把A看成浏览器也就是客户端)
A 对摘要应用了一个“签名”函数,这个签名函数就是数字证书里面约好的。这个函数会将用户的私有密钥作为参数。因为只有用户B(服务器)才知道私有密钥,所以正确的签名函数会说明签名者就是其所有者。在图中,由于解码函数 D 中包含了用户(服务器)的私有密钥,所以我们将其作为签名函数使用(RSA 加密系统将解码函数 D 作为签名函数使用,是因为 D 已经将私有密钥作为输入使用了。注意, 解码函数只是一个函数,因此,可以将其用于任意的输入。同样,在 RSA 加密系统中,以任意顺序 应用 D 和 E 函数时,两者都会相互抵消。因此 E(D(stuff)) = stuff,就像 D(E(stuff)) = stuff 一样) 注意:这里请用工程思想去理解,也就是私有密钥作为参数这句话,只有服务器才知道私有密钥。
一旦计算出签名,节点 A 就将其附加在报文的末尾,并将报文和签名都发送给B 在接收端,如果节点 B 需要确定报文确实是节点 A 写的,而且没有被篡改过, 节点 B 就可以对签名进行检查。节点 B 接收经私有密钥扰码的签名,并应用了 使用公开密钥的反函数。如果拆包后的摘要与节点 B 自己的摘要版本不匹配,要 么就是报文在传输过程中被篡改了,要么就是发送端没有节点 A 的私有密钥(也 就是说它不是节点 A)
用大白话说:这个过程就是验证A就是浏览器,用户就是服务器。而不是中间者(或者黑客)。浏览器知道数字证书上的签名函数,对发送的报文生成一个非常小的摘要信息。那么这个信息就是唯一不可改变的信息。服务器收到后用公开密钥(当然应用了私有密钥)得到报文摘要C。然后自己再用同样的签名函数对明文得到报文摘要D。如果C==D,说明验证成功。否则就是有问题的。当你看到这里说明你已经成功70%了!!!