打个比方,有两个小朋友在网上相互发消息,名字分别是小明和小红,小明想要给小红发个消息,但是呢,又担心发的消息被别人修改,就像信件被邮局修改那样。所以呢,小明想了个办法。给数据“签个名”,然后小红同学呢,就验证这个数据的签名是不是小明同学的,如果是,那么数据没有被修改。那怎么签名呢?

数字签名

联想到现实中,我们一般是手写个签名或者给信件盖个章,如果大家有一点经验的话,应该看到过这种盖章,就是把章盖在信件重要内容上。如下:

test

这种盖章的好处是什么呢?很简单,因为如果要改变内容的话,就一定会改变盖的章,所以,小红就可以轻易地检测出信件是否被修改过。好,这是现实情况。在数据的世界里怎么办呢?怎么给数据“盖章签名”呢?

要给数据盖章,我们就得搞懂两个问题:

  1. 数据世界里,什么是“章”
  2. 数据的重要内容是什么

“章”:非对称加密的公私钥

这部分可能得扯很久,为了简单起见,只简单的说一下。在数字的世界里,有一门学科叫密码学,密码学中又有一个领域就非对称加密,非对称加密有两个密钥,一个叫私钥,一个叫公钥。这两个密钥都可以用于给数据加解密:

  1. 如果是私钥加的密,那么就用公钥解密
  2. 如果是公钥加的密,那么就用私钥解密

都可以加解密的话,公钥私钥有什么区别,就一点:私钥可以推断出公钥,但反过来不行。所以,只要我们手里的私钥不给任何人,只有自己知道的前提下,我们就可以用私钥给数据加密,然后把公钥给别人,让他用公钥解密。如果公钥无法解密,说明私钥不是我的。所以,公钥体系能达到“章”的作用。

数据的重要内容

这就简单了,就是数据的哈希值(这里较为简单,就一笔带过了,如果有不懂的同学,可以google下)。

签名

懂了公私钥的话,签名的概念就容易理解了。签名就是用私钥将数据的哈希值加密,然后接收方用公钥解密出哈希值,然后接收方再计算一次数据的哈希进行对比,不同,则数据被篡改。

回到例子本身,过程如下:

  1. 小明准备一套私钥和公钥
  2. 将公钥发给小红
  3. 编写一条消息
  4. 计算消息的哈希值
  5. 用私钥对上面计算出的哈希值加密,将签名附在消息的后面
  6. 将消息发给小红
  7. 小红接收到消息
  8. 解析出签名
  9. 用公钥解密签名获得哈希
  10. 自己计算一次数据哈希
  11. 对比哈希值
  12. 得出结果

以上就是数据签名的原理和用途。那到底什么是数字认证呢?

CA证书

上面有一个很重要的一步,就是第2步:将公钥发给小红。小红怎么知道这个公钥是小明给她的呢?

这里就需要数字证书了。也就是说,数据证书是来解决公钥的信任问题的。

到这一步,密码学的帮助其实就不大了,因为我们要引入权威第三方机构了。

首先,小红和小明得找到一个双方都信任的第三方机构,这个机构我们将它 称为CA(Certificate Authority)首先给两人各发一张证书。

这张证书里有下面这些内容:

签发者:CA自己
公钥:1024/2048位公钥(明文)
有效期:xx
哈希算法:将公钥生成哈希
加密算法:将哈希用私钥加密,生成签名
签名:见上

证书的签名就是上述的数字签名,数据是公钥,所以,小红和小明可以用证书里的公钥对签名进行解密,然后自己对公钥进行哈希计算,然后进行验证,从而可以确保CA证书是正确的。这个证书叫根证书

小明的证书

然后接下来,小明将自己的公钥和自己的一些信息交给CA中心,CA中心呢,就按照上述的格式给小明签发了一组证书,内容如下:

签发者:CA
公钥:小明的公钥
有效期:xx
哈希算法:将小明的公钥生成哈希
加密算法:将哈希用私钥加密,生成签名
签名:见上

然后有了证书的小明就把自己的证书发给小红,小红拿到后,先用CA的公钥解密签名,然后就是将小明的公钥进行哈希计算,对比一下后就可确定这的确是小明的公钥。

以上就是数字证书的原理。