咱们先来看下数据在互联网上数据传递可能会出现的三个比较有表明性的问题,其实后面提到的全部方法,都是围绕解决这三个问题而提出来的。git
假设 A
正在经过互联网向 B
发送数据,若是不对数据进行加密,数据就可能被恶意的第三者 X
看到github
所以,须要保密的数据须要进行加密再发送安全
B
B
使用密钥解密从 A
收到的密文,这样就能获得原始数据“对称密钥加密” 一个很重要的特色就是使用相同的密钥进行加密和解密服务器
回到刚刚那个场景,假设 B
是没有解密钥匙的,因此 A
须要经过互联网将钥匙发送给 B
并发
X
也有可能看到这个钥匙X
也能够经过这个钥匙来解密密文上面这个场景就会引出一个新问题,这个问题被称为 “钥匙交付问题”,那怎么解决这个问题?加密
为了解决上面的 “钥匙交付问题”,咱们这里引入一个新的方法 —— "公开密钥加密",下图是 “公开密钥加密” 的主要特色3d
咱们来看看 “公开密钥加密” 的一整个过程代理
接收方 B
建立一个公钥和一个私钥,公钥被发送给 A
code
A
使用从 B
收到的公钥加密数据,将密文发送给 B
B
使用私钥解密从 A
接收到的密文,获得原始数据在这个过程当中cdn
B
保存的,X
没法获取到,天然没有办法解密密文混合密钥加密分为两个步骤
为了更好地理解公开密钥加密的可靠性问题,咱们回到传递公钥的场景
A
拿到的实际上是 X
发送给他的伪造公钥,可是 A
没法察觉
最后,X
用他本身的密钥加密响应数据,并发送给 A
,就这样,虽然 A
、B
双方能顺利完成通讯,可是恶意的第三方 X
能看到解密后的请求数据和响应数据,而 A
、B
双方则绝不知情。
这种经过秘密替换公钥窃取数据的方法被称为“中间人攻击”,问题的根源在于 A
没法确认他们收到的公钥是否由 B
方建立。怎么避免中间人攻击呢?咱们放到数字证书那节再探讨,接下来再讲解一点前置知识
消息鉴别码在英文中被称为 MAC
,MAC
能够理解为密钥和密文组成的字符串的哈希值
消息鉴别码虽然能够解决伪造
问题,可是仍然没法避免 否定
问题
为了解决这个 否定
问题,咱们接下来看看 “数字签名” 方法
虽然上面的方法已经能避免 窃听
、伪造
、否定
等问题,可是如今仍是没办法避免“中间人攻击”,由于咱们仍是没办法验证公钥的全部者,所以咱们须要 “数字证书” 系统来验证公钥的全部者。
接下来,先看看数字证书申请的过程,咱们将数字证书认证机构(Certificate Authority)咱们称之为 CA
如今 B 已经申请到一个数字证书了,那么怎么使用数字证书来检验公钥 PB 是属于 B 呢
如今能够验证 PB 是属于 B 的,可是怎么验证 PC 是属于受信任的 CA 的呢
事实上,认证机构造成一个树形结构,高级别的权威机构为较低级别的机构建立证书,那就是说,若是要验证的话,就是一级一级向上认证,信任链条的最终是Root CA,他采用自签名,对他的签名是无条件的信任。
彻底理解上面说的东西以后,就可以很容易理解 HTTPS
,它采用的就是上面说的 “混合加密” + “数字证书” 两种技术,来保证整个通讯过程的安全可靠。
HTTPS
作的事情其实就是在传输层跟应用层之间加了一层 SSL/TLS
,用于对 TCP
传输内容的加密和解密
下图咱们再看一下详细的工做流程
到此,咱们都知道了 HTTPS、数字证书等相关的知识,能够动手实现一个中间人代理服务了,这里附上一个连接,有兴趣的话能够看下怎么 用 Node 实现一个中间人代理服务器