数字签名
本文翻译自著名的 David Youd 编的小故事
什么是数字签名?
张三有两把钥匙,其中一把叫公钥,另一把叫私钥。
张三有一些同事:李四、王五、赵六。
任何需要的人都可以拿到张三的公钥,但私钥只有他自己有。密钥是用来加密信息的。加密信息,就是把信息搞乱,这样只有有特定密钥的人才能把信息恢复成可读的样子。张三的任意一把密钥都可以加密信息,另一把则可以解密信息。
赵六可以拿张三的公钥加密一段信息。张三用他自己的私钥解密信息。张三的所有同事都可以拿到赵六加密的信息,但是因为没有张三的私钥,这些信息只是一锅糊粥。
拥有了这个私钥,再加上合适的软件,张三也可以给文档或者其他数据增加数字签名。数字签名就像是张三盖在数据上的一个戳,这是唯一的,只有张三能盖,而且很难伪造。另外,这个签名也可以保证任何对已签名的数据的修改都很难不被察觉。
要给一个文档签名,张三的软件会先通过一种叫哈希的技术,把文档压缩成几行,这几行数据叫做信息摘要。(没有办法把信息摘要还原成原始数据)
然后张三的软件会用私钥加密这段信息摘要,得到的就是数字签名。
最后,张三的软件会把这个数字签名添加到文档中,所有被哈希的数据都被签名了。
现在张三把文档传给李四。
首先,李四的软件会用张三的公钥解密签名,得到信息摘要。如果这没问题的话,就证明的确是张三签名的文档,因为只有张三有他自己的私钥。然后李四的软件会把文档数据进行哈希,得到一个信息摘要,如果两个信息摘要一模一样的话,就说明签名的数据没有被修改过。
现在让我们开始加速。
王五,一个不太友好的同事,想要欺骗李四。王五让李四收到了一份看上去是来自张三的加密信息和公钥。在李四不知情的情况下,王五用张三的名字创建了一个密钥对。那么,在无法由张三亲自递交公钥的情况下,李四如何确定张三的公钥,的确是张三的公钥呢?
说巧不巧,赵六就在一家证书认证中心工作。赵六可以为张三创建一份数字证书,只需要把张三的公钥和一些相关信息收集起来,签个名就可以了。
现在,张三的同事可以通过检查张三的可信证书来确保公钥的确是张三的。实际上,张三公司的人收到的签名,都是由赵六认证过的。这样一旦有私钥被泄露或者不再需要,赵六就可以撤销签名。对赵六来说,还有更大的认证机构来对赵六进行认证。
假如说,张三给李四发送了一份签名的文档。要验证文档的签名,李四的软件会先用赵六(认证机构)的公钥检查张三证书上的签名,如果能成功把签名解密,则表明这的确是赵六创建的。签名解密之后,李四的软件会检查张三在认证机构是否信誉良好,是否跟张三身份有关的认证信息都没有更改。
然后李四的软件会从证书中拿出张三的公钥来检查张三的签名。如果张三的公钥可以成功解密签名,就说明这个签名的确是张三的私钥创建的,因为赵六已经认证了这个公钥是张三的。当然,如果签名有效,我们就知道王五没有修改签名的信息。
读完故事后的自我总结
认证的过程看起来复杂,但其实捋一捋,都是一样的流程。
首先我们先捋清楚一件事,
假设我们有一个文档,对文档哈希,然后把哈希用私钥加密,得到的就是签名,把文档跟签名放在一起,发布出去,就是一则信息。
拿到信息的人要验证其可信性,就用公钥解密签名,得到哈希,再把文档哈希一遍,两个哈希一致,就可以证明信息的可信性。
这个环节中,如果公钥不能解密签名,说明信息来源不对,如果能解密,但是得到的哈希跟文档的哈希不一致,那么说明文档有被修改。
这里涉及到的一个问题,就是公钥满天飞,如果别人冒我的名创建一份密钥对,给其他人发信息,误导他们以为那个人是我,这该怎么判别呢?
于是出现第三方机构,给我的公钥签个名,我就得到了一份证书。其实这里的步骤跟前面完全一样,只不过签名的文档换成了我的个人及信誉信息外加我的公钥。我在发送信息的时候,一起把证书发出去。
拿到信息加证书的人,先验证一下证书的可信性,再用证书里的公钥验证文档的可信性,其实也是两个相同的步骤。
但是人们如何信任这个第三方机构颁发的证书呢?于是有一个更大的第三方机构给这个小的第三方机构颁发证书,证明他的公钥是真的。这个步骤也跟前面完全一样。最后的结果就是证书一级级认证。