Pinvon's Blog

所见, 所闻, 所思, 所想

数字签名与数字证书

通俗解释一

  1. B有一对密钥, 分别是公钥和私钥.
  2. B把公钥送给他的朋友们: A, C, D.
  3. A给B写信. 写完后用B的公钥加密, 就可达到保密的效果.
  4. B收到A的信. 用私钥解密, 可以看到信的内容. 只要B的私钥不泄露, 就算信在别人手中, 信件内容也无法破解.
  5. B给A回信, 采用数字签名. 先将回件的内容用Hash函数生成内容摘要, 再用私钥对摘要加密, 生成数字签名. (其实数字签名是对内容直接用私钥加密, 但是一般情况下, 信息较大, 直接加密的话运算量很大, 所以一般会先对信息提取摘要, 算法有SHA-256等, 再对摘要用私钥加密)
  6. B将数字签名附在信件下面, 发给A.
  7. A收到信后, 取下数字签名, 用B的公钥解密, 得到信件的摘要. 由此证明, 信确实是B发出的.
  8. A再对信件本身使用Hash函数, 将得到的结果, 与B给的摘要进行对比, 如果两者一致, 就证明这封信未被修改.
  9. C想欺骗A, C偷偷使用A的电脑, 用自己的公钥换走了B的公钥. 此时, A实际拥有的是C的公钥. 因此, C就可以冒充B, 用自己的私钥做成数字签名, 写信给A.
  10. A感觉不对劲, 发现自己无法确定公钥是否真的属于B. 于是, A要求B去证书中心(CA), 为公钥做认证. 证书中心用自己的私钥, 对B的公钥和一些相关信息一起加密, 生成数字证书. 如图1所示.
  11. B拿到数字证书以后, 就可以放心了, 以后再给A写信, 只要在签名的同时, 再附上数字证书就行了.
  12. A收到信后, 用CA的公钥解开数字证书, 拿到B的公钥, 然后就能证明数字签名是否真的是B签的.

0.png

Figure 1: 图1

实例(https, 主要用于网页加密)

  1. Client向Server发出加密请求.
  2. Server用自己的私钥加密网页后, 连同本身的数字证书, 一起发给Client.
  3. Client(浏览器)在证书管理器中有"受信任的根证书颁发机构"列表. Client会根据该列表, 查看解开数字证书的公钥是否在列表之内.
  4. 如果数字证书记载的网址, 与正在浏览的网址不一致, 就说明该证书可能被冒用, 浏览器会发出警告.
  5. 如果该数字证书不是由受信任的机构颁发的, 浏览器会发出另一种警告.
  6. 如果数字证书是可靠的, Client就可以使用证书中的Server公钥, 对信息进行加密, 然后与服务器交换加密信息.

通俗解释二

例子

假设A公司的张三先生要到B公司去拜访, 但是B公司的所有人都不认识他. 所以常用的办法是带公司开的一封介绍信, 并在信上敲上A公司的公章. 张三先生到了B公司后, 把介绍信给B公司的前台李四, 李四一看介绍信上有A公司的公章, 就相信张三先生不是歹人了.(这边假设公章难以伪造)

如果和B公司有业务往来的公司很多, 每个公司的公章不同, 那李四要能分辨各种公章, 非常麻烦. 于是出现了中介公司C, 专门开设了一项"代理公章"的业务.

于是, 张三先生去B公司, 需要带2封介绍信:

介绍信1: 含有C公司的公章和A公司的公章, 且注明C公司信任A公司.

介绍信2:含有A公司的公章, 并包含一些具体内容.

这样, 李四就不需要记住各个公司的公章的样子了, 只要记住中介公司C的公章即可. 当李四拿到两封介绍信后, 先检查介绍信1的C公章, 验明正身; 确认无误后, 再对比介绍信1和介绍信2的公章是否一致, 如果一致, 说明介绍信2是可信任的.

专业术语

证书

专业解释

相当于例子中的公章, 它证明介绍信确实是A公司发出的. 在实际网络通信过程中, 一般是用来证明某请求确实是某用户发出的.

CA

专业解释

负责管理和签发证书的第三方机构, 相当于例子中的C公司. 一般来说, CA必须是所有行业和所有公众都信任的, 认可的, 因此它必须具有足够的权威性.

CA证书

CA颁发的证书. 在例子中, 它用来证明介绍信1确实是CA发出的. CA证书中, 包含要CA证书来证明的实体的公钥. 如例子中, 介绍信1中包含公司A的公章. 接收者可以用介绍信1中的公章来对比介绍信2中的公章是否相同.

证书之间的信任关系

例子中, 介绍信1注明了公章C信任公章A. 证书之间的信任关系, 就是用一个证书来证明另一个证书是真实可信的.

根证书

专业解释

假设C证书信任A证书和B证书, A证书信任A1证书和A2证书, B证书信任B1证书和B2证书. 则它们之间, 构成了一个树形关系:

1.png

处于树根位置的证书, 就是根证书.

除了根证书, 其他证书都要依靠上一级的证书来证明自己. 而根证书, 是自己证明自己可靠.

数字签名

数字签名是将摘要(digest1)用A(发送者)的私钥加密, 与原文(Context)一起传送给B(接收者). B只有用A的公钥才能获得摘要(digest1), 然后用Hash函数对收到的原文(Context)进行计算, 得到另一个摘要(digest2), 对比digest1和digest2. 如果相同, 说明收到的信息未被修改, 否则被修改过.

数字签名可以验证信息的完整性.

数字签名是数字证书的hash值加密的结果.

Comments

使用 Disqus 评论
comments powered by Disqus