加密的目的是只有通信双方能看到通信内容。
使用过程中一般是一个服务端,多个客户端。
目前加密方式要么是对称加密,要么是非对称加密,对称加密是加密解密都是同一个,非对称加密分公钥和私钥,私钥加密的内容公钥都能解,而公钥加密的只有私钥能解。
先考虑直接用对称加密和非对称加密存在的问题,如果服务端与客户端都使用一个对称加密,大家都知道密码,相当于明文通信了;如果使用非对称加密,私钥放服务器端,客服端可以安全发送信息给服务器,但服务器发送的大家都能解密,大家都能看到。所以使用一个对称加密和非对称加密都存在问题。
那怎么解决这个问题?首先不同的客服端采用不同的非对称加密肯定不对,一对一通信不应该分公私,因此解决方案就是不同客户端与服务器通信采用不同的对称加密。这又存在个问题,这个对称加密放在客户端还是放服务器呢?如果放客户端/服务器,又怎么发送给服务器/客户端,即使别人截获也无法看到真实内容呢?
如果对称加密放服务器端,然后通信时发给客户端可以么? 首先发送给客户端肯定不能明文方式,那就得加密,加密必须只能客户端知道,这就需要先将解密方法加密发给客户端,这就会陷入死循环中,鸡与蛋的问题。
终极解决方案:将客户端与服务端的对称加密方式生成放客服端,而非对称加密的私钥放服务器端,公钥放客服端。客户端需要与服务器通信时,将对称加密方式以非对称加密方式发送给服务器端,这个过程是安全的,因为只有服务器有私钥,然后后面通信就可以使用客服端传来的对称加密来加密数据,这个加密算法只有当前客户端与服务器知道,所以双方通信就安全了。
这还有个问题,客服端一开始是没有非对称加密的公钥的,那就需要向服务器端请求,然后服务器发送给客户端,如果这个公钥被顶包了怎么办?
这就是数字证书的作用了,在服务器端使用数字证书的私钥加密非对称的公钥,这步我们只是确保拿到的是正确的公钥,即使被看到也是没关系的,因为公钥本来就是公开的,怎么确定拿到的就是正确的?经过数字证书私钥加密过的,只有对应的公钥能解密,如果解密失败说明什么?说明被替换了,能成功解密就说明拿到的公钥是正确的。
到此,整个过程就清楚了。剩下的就是客户端的数字证书验证了。