https实现原理

Http协议
由于 HTTP 协议在通信过程中 , 是基于明文通信 , 并且底层是基于 TCP/IP 协议进行通信 , 那么按照 TCP/IP 协议族的工作机制 , 通信内容在所有的通信线路上都有可能遭到拦截和窃取 。
https 安全传输协议
由于 HTTP 协议通信的不安全性 , 所以人们为了防止信息在传输过程中遭到泄漏或者篡改 , 就想出来对传输通道进行加密的方式 https 。https 是一种加密的超文本传输协议 , 它与 HTTP 在协议差异在于对数据传输的过程中 , https对数据做了完全加密 。由于 http 协议或者 https 协议都是处于 TCP 传输层之上 , 同时网络协议又是一个分层的结构 , 所以在 tcp 协议层之上增加了一层 SSL(Secure Socket Layer , 安全层)或者 TLS(Transport Layer Security) 安全层传输协议组合使用用于构造加密通道 。

https实现原理

文章插图
 
推导 https 的设计过程
我们先不去探究 ssl 的实现原理 , 我们先从设计者的角度去思考如何去建立一个安全的传输通道 , 客户端 A 向服务端 B 发送一条消息 , 这个消息可能会被拦截以及篡改 , 我们如何做到 A 发送给 B 的数据包 , 即使被拦截了 , 也没办法得知消息内容并且也不能查看呢?
https实现原理

文章插图
 
我们首先了解几个基本概念 。
共享密钥加密(对称密钥加密):加密和解密同用一个密钥 。加密时就必须将密钥传送给对方 。
公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥 。一把叫做私有密钥 , 一把叫做公开密钥 。私有密钥不能让其他任何人知道 , 而公开密钥则可以随意发布 , 任何人都可以获得 。使用此加密方式 , 发送密文的一方使用公开密钥进行加密处理 , 对方收到被加密的信息后 , 再使用自己的私有密钥进行解密 。利用这种方式 , 不需要发送用来解密的私有密钥 , 也不必担心密钥被攻击者窃听盗走 。
利用对称加密
要做到消息不能被第三方查看以及篡改 , 那么第一想法就是对内容进行加密 , 同时 , 该消息还需要能被服务端进行解密 。所以我们可以使用对称加密算法来实现 , 密钥 S 扮演着加密和解密的角色 。在密钥 S 不公开的情况下 , 就可以保证安全性?
https实现原理

文章插图
 
在互联网世界里 , 通信不会这么简单 , 会存在多个客户端和服务端产生连接 , 而这个客户端也许是一个潜伏者(黑客) , 如果他也有对称密钥 S , 那相当于上面的方案是不可行的 。
https实现原理

文章插图
 
如果服务端和每个客户端通信的时候使用不同的加密算法呢?
https实现原理

文章插图
 
似乎能够完美解决问题 , 然后?密钥如何分配呢?也就是服务端怎么告诉客户端该使用哪种对称加密算法呢?解决办法似乎只能通过建立会话以后进行协商了 。但协商过程又是不安全的?怎么破?
非对称加密
非对称加密算法的特点是:私钥加密后的密文 , 只要有公钥 , 都能解密 , 但是公钥加密后的密文 , 只有私钥可以解密 。私钥只有一个人有 , 而公钥可以发给所有人
https实现原理

文章插图
 
这样就可以保证 A/B 向服务器端方向发送的消息是安全的 。似乎我们通过非对称加密算法解决了密钥的协商的问题?但是公钥怎么拿?使用非对称加密算法 , 那么如何让 A、B 客户端安全地持有公钥?那么我们逐步思考 , 有两种我们能想到的方案:
1. 服务器端将公钥发送给每一个客户端
2. 服务器端将公钥放到一个远程服务器 , 客户端可以请求到
方案一似乎不可行 , 因为 , 传输过程又是不安全的 , 公钥可能会被调包
https实现原理


推荐阅读