数字签名,数字证书,SSL
----------------------------------------------------------------------------------------------------------------
对称加密
只有一把密钥。密钥能加密数据,同时还能反向解密数据
例如:数据A 通过密钥1 加密成 A1,然后通过同一把密钥1 解密成A。
用途:快速加解密数据
非对称加密
有两把密钥。都能加密和解密,但是不能自加自解,只能是自加彼解。
例如:数据A 通过密钥1 加密成 A1,然后通过同一把密钥1 无法解密,只能通过另一把密钥2才能解密成A。
通常,两把密钥里,自己留一把,向外界公开一把。自己留的一把叫私钥,公开的一把叫公钥。
用途:签名(私钥签名,公钥验证), 加密对称加密的密钥(公钥加密,私钥解密)
----------------------------------------------------------------------------------------------------------------
数字签名
非对称加密的典型用例。数字签名的特点是:不可抵赖性,不可伪造性。
下文以小王为例:小王有两把密钥:一把私钥在自己手里,一把公钥复制后公开给了朋友们。
朋友中任何一个人都可以通过小王的公钥加密信息,但是只有小王能通过私钥解密,其他人都不行。
同样,小王能通过私钥加密信息,朋友中的任何一个人都可以通过公钥解密。
小王用私钥加密的信息,如果朋友用公钥解密了,至少能说明一件事:
消息的确是小王发送的,因为加解密是成对的,能用小王的公钥解密,就说明加密的一定是小王的私钥,而只有小王持有私钥,这就能证明加密者一定是小王,小王是无法抵赖的。(这就是数字签名的不可抵赖性)
------------------
→ 签名过程:小王
Step1:把 原始数据 哈希成 摘要。 这个过程不可逆。
(为何要哈希成摘要,是因为原始数据通常都比较大,直接签名比较耗时,哈希成摘要后,摘要的数据很小,签名很快。)
Step2:把 摘要 通过小王的私钥 作成 签名
Step3:把 原始数据 + 签名 发送给小王的朋友们
→ 解签过程:小王的朋友们
Step1:通过小王的公钥 从 签名 解秘出 摘要。
(如果能解开,说明原始数据的确来自小王。如果不能解开,说明签名被第三者篡改了,原始数据连带签名已经不可信任。)
Step2:把 原始数据 哈希成 另一份摘要, 把两个摘要比对一下。
(如果一样,说明原始数据没有被篡改,如果不一样,说明原始数据被第三者篡改了,已经不可信任。)
------------------
信息传递过程中,如果原始数据不加密的话,第三者的确很容易窃取并修改原始数据,但是重点是第三者难以修改签名。
因为第三者的终极目的并不是想让小王的朋友们认为原始信息是第三者发送的,他的终极目的是想让小王的朋友们依然认为篡改后的信息还是小王发送的原始数据,这样才能起到他篡改数据的目的。
根据不可抵赖性的特点,第三者如果想让小王的朋友们继续认为原始数据还是小王发送的的话,他就必须得用小王的私钥来加密被他篡改后的原始数据。因为只有小王的私钥加密的数据,朋友们才能用小王的公钥解密,才能让朋友们继续误认为这还是来自小王的原始数据。如果第三者随随便便拿一个其他私钥加密篡改后的数据,朋友们用小王的公钥在解密的时候就无法解开,就不会再认为这是来自小王的原始数据。所以,拿到小王的私钥是第三者实施篡改的前提条件。
所以,只要小王的私钥不泄露,第三者就改不了签名,即使修改了原始数据,根据解签逻辑也能很容易判断出来被人篡改过。所以,签过名的数据是不会被伪造的。(这就是数字签名的不可伪造性)
----------------------------------------------------------------------------------------------------------------
数字证书
虽然修改小王做好的签名比较困难,但是替换朋友们所持有的小王的公钥还是有可能的。
黑客小黑(上文的第三者)在用户小白(上文的小王的朋友们中的一个)的电脑上偷偷装了个木马,把小白所持有的小王的公钥偷偷换成了自己的公钥,这样,小白以为自己还持有小王的公钥,其实她持有的是小黑的公钥。
这样,小黑就可以肆意地截取小王发给小白的原始数据,篡改一下,然后用自己的私钥签名后发给小白,小白用自己持有的小王的公钥(实际上是小黑的公钥)解签,得到了篡改后的原始信息,此时小白还以为这个信息是来自小王的真实信息,其实这已经是小黑篡改过的信息了。
自己持有的公钥到底是不是我认为的那个人发布的公钥呢?这个是核心问题。
小王考虑再三,决定找证明机构小郑来给自己的公钥做证明。小郑人脉很广,方法也多,他找到了在微软就职的朋友小薇。
小郑和小薇商量,小郑说:我也有私钥和公钥。我把小王的公钥和我给小王开的证明打个包,用我的私钥签名一下,把这个签名颁发给小王,让小王每次在给小白发信的时候,除了附带自己的签名,也附带上我的签名。你那边呢,麻烦把我的公钥写死到你的Windows系统里,然后尽快推送更新,去更新小王的朋友们的电脑。
这样,小白收到Windows更新后更新了电脑,他的电脑就含有小郑的公钥了。在小白收到小王的信后,首先用小郑的的公钥解开小郑的签名,拿到小王的公钥,同时还能看到小郑给小王开的证明,然后再用小王的公钥解开小王的签名,再去判定有没有被黑客篡改过。
就这样,在微软的小薇和证明机构的小郑的帮助下,小王和小白又能安全地通信了,小黑再也没法篡改他们的通信数据了。
他们的分工是:
小薇负责在Windows里面嵌入小郑的公钥,从小郑身上收取费用
小郑负责验证小王的身份,给他颁发签名(小王的公钥+证明信,并用小郑的私钥签名),从小王身上收取费用
小王负责每次发信的时候也带上小郑的签名。
----------------------------------------------------------------------------------------------------------------
多层证书
我证明他是我朋友的朋友的朋友的朋友…
小郑的这个思路很好,所以很有人气,导致他的证明业务大火,慢慢地他就忙不过来了,所以他想发展下线。
首先他和微软的小薇的合作不变,小郑仅仅把证明最终用户小王的公钥合法这个事情调整了一下。他不再证明最终用户的合法性,他仅仅证明他的下线的合法性。
例如,他找了一个下线,名字叫小夏,他把小夏的公钥和自己出具的小夏合法的证明书打包,然后用自己的私钥签名,颁发给了小夏。
小夏再模仿之前小郑给小王开证明的方法,依葫芦画瓢,给小王颁发了一个签名。
这样,小王在给小白发信的时候,除了原始信息,还要包含自己的签名,小夏的签名(小夏的签名里含有小郑的签名)。小白在收到信的时候,首先使用Windows内置的小郑的公钥解开小郑的签名,拿到小夏的公钥和证明信,然后用小夏的公钥解开小夏的签名拿到小王的公钥和郑明信,最后拿小王的公钥解开小王的签名,去判断原始数据有没有被篡改。
依此类推,小夏还可以发展自己的下下线小小夏…
(可以这样想象角色)
小薇:微软Windows
小郑:证明机构VeriSign
小夏:证明机构GoDaddy
小王:一般企业Tencent
小白:一般网民
小黑:恶意用户或企业
原始信息:QQ客户端安装包.exe
----------------------------------------------------------------------------------------------------------------
SSL
对称加密和非对称加密的完美合作
客户端:向服务端发起请求
服务端:生成非对称加密的私钥和公钥,公钥分发给客户端。私钥自己持有。(公钥的合法性通过上文的数字证书保证)
客户端:生成对称加密的密钥,利用服务端的公钥对这个密钥加密,发送给服务端。
服务端:使用自己的私钥解密,得到这个客户端的密钥,此时,两端都有了匹配的密钥,可以快速加密解密数据。