背景
同事去大厂面试,回来带回来一个问题,聊聊Https的安全和非对称加密。刚好自己对这块网络协议也不是很熟悉,刚好研究一波。
探讨解析
Https如何保证安全?
Https这边主要采用了对称加密+非对称加密+CA认证去保证安全。
当我们在网络上传输信息的时候,需要确保信息的安全,不被窃听,不被拦截,那从最简单的方式,就是双方约定好一个暗号(key),用相同的key对信息加密和解密,一般采用一种叫AES算法来加密,AES保证了只要你的key足够长,破解几乎不可能。
好了这样一来貌似安全了,但是有一个严重的问题,这个key,怎么给对方,如果直接通过网络传输还是会被中间人截取,到时候中间人知道了你们的key,照样可以破解,这个时候出现了另一只算法,非对称加密,这个加密方式比较复杂,简单的来说就是生成一对秘钥key1和key2,凡是key1加密的数据只能key2能解,key2加密的数据只能key1能解,这种算法很多,常用的是RSA,RAS基于二个非常大的素数乘积很容易算,但是像根据乘积算二个素数很复杂。
步骤如下图:(假设是A和B之间交互)
- 利用RAS技术生成key1和key2,这里的key只能对方的key能解决。
- A这边用明文的方式发送key1到B,就算被截取了,人家也无法破解。
- B这边接收到key1后,另外准备一个需要对称加密的key,用key1对key进行加密。
- B这边讲加密好后的key传输到A,就算被截取了,人家也无法破解。
- A这边用key2吧加密后的key解出来,这样双方就拿到了需要对称加密的key了。
- 双方用key进行信息传输。
问题:为什么不用非对称加密直接对信息加密而是对key加密,原因是非对称加密和解密消耗时间非常长,通常不这么做。
好了这样一来貌似安全了,但还是有一个漏洞,比如说,我A和B中间有一个中间人(简称Z),那么很有可能会A发送的时候被Z截取,Z伪造了一个key,假装自己是B,用A发过来的key1对伪造的key加密,然后返回给A,让A误以为Z就是B,同样伪装成A和B完成一次秘钥的交互。那么接下来,A和B之间的交互信息就不安全了。解决这中问题,会引入第三方CA,CA是一些非常权威的专门用于认证网站合法性的组织,服务商也就是B,可以向CA申请一个证书,使得他们在建立连接的时候带上CA的签名。其实到这里也不是绝对的安全,假设CA证书除了问题被中间人攻击了,但大多情况下不必杞人忧天,基本上是安全的。