在上一章节中,我们了解到对称加密和非对称加密的场景。
如何运用到我们实际的场景中呢?比如HTTPS
同时,在上一章中,我们还遗留了几个问题,这几个问题没有处理好,那么小红和小绿的通讯还是有可能被中间人攻击的。
首先我们还是先说一说数字签名和数字证书。
简单来说就是服务器怎么证明自己是服务器而不是中间人伪造的。
我们来看一个场景
小红 和 小绿 商量 使用RSA非对称加密 进行首次通讯。
step1:
小红获取到"小绿"的公钥后,使用公钥把明文数据进行加密
step2:
"小绿"收到数据后,用私钥进行解密。把 "结果返回"。
此时会出现一个问题,小红无法知道"小绿" 是不是真实的小绿。所以真实的小绿得证明自己不是假的。
所以,实际的做法是 小绿 用私钥把 数据进行加密后,返回给小红,小红能通过小绿提供的公钥进行解密。
如果解密成功,只能证明在这一时刻 小红 给小绿 发送的数据 以及小绿返回给小红, 这两个小绿是同一个人。
这里引申了一个重要的概念,小绿的公钥加密数据后,可以通过私钥进行解密,同时 ,使用私钥解密后 能通过公钥进行解密。于是乎才能认定是同一个人。
下面来通过画图来解释这几个步骤:
这里我们假设
图中,虽然一切都看起来非常正常,但是小红无法感知小绿是不是真的小绿,因为所有人都可以生成公钥。
所以就引申出一个问题,小绿怎么证明自己是小绿(好比之前新闻上说怎么证明你妈是你妈~)
这里就要说到数字签名了。
既然小绿不能证明自己是小绿,那小红可以去民政局、派出所(权威机构)。
这里数字证书就可以认为派出所。
小红先去权威的数字证书中心,找到小绿的个人信息(小绿的公钥)与小绿的公钥进行对比。
如果一致,那么就可以证明小绿是真的小绿
前一章节的对称加密和非对称加密与这一章节的内容中。我们可以把这两章的内容看做HTTPS的通讯内容
所涉及的知识点包括,对称加密,非对称加密,Hash算法,数字签名和数字证书
这中间每一个步骤都不能缺少。
在非对称加密的过程中,用公钥加密的数据只能通过私钥进行解密。用私钥加密的数据只能通过公钥进行解密。(如果不能用私钥进行加密,那么服务端返回给客户端的第一步永远都是不安全的,因为中间人可以劫持)。虽然中间人还是可以劫持,但是由于中间人不知道服务器的私钥,所以就算中间人使用自己的私钥进行加密,客户端也无法解密(客户端使用的是数字证书提供的公钥解密)
同时Hash算法能保证服务端返回的数据没有被篡改过(虽然中间人可以把内容修改后,重新计算MD5码。但是由于中间人无法解密数据内容,所以能保证数据是安全的)
数字证书尝试用一个权威的机构来证明 服务器 不是被中间人冒充的假冒服务器。
再回顾一下流程:
client 向CA请求服务端的公钥、向服务端请求公钥。两者对比是否一致
client 通过服务端公钥把数据进行加密发送给server
server用私钥解密数据后,用私钥进行加密并且计算hash,把数据返回给client
client 使用server的公钥进行解密,查看解密后的结果与自己传过去的结果是否一致。
看似非常完美,但是这中间的问题仍然存在
-
client是完全信任CA的结果的,怎么确认CA一定不是冒充的?
-
中间人虽然不知道数据内容,但是仍然可以劫持数据(虽然知道数据内容是什么,但是中间人可以一直恶心对方,类似DDOS)
具体加解密和验签代码参考:RSAUtil