HTTP 与 HTTPS 的区别
其实 HTTPS 与 HTTP 一样都是应用层协议, HTTPS 只是在 HTTP 的基础上再加上了一个加密层.
为啥要对 HTTP 进行加密呢?
HTTP 协议内容都是按照文本格式明文传输的, 这就导致在传输过程中可能会被篡改. (明文传输的各种信息会被别人一览无余, 没有隐私)
曾经就发生过一个大事件 : “运营商劫持”.
就好比我现在进入官网下载一个官方软件, 点击下载后弹出的是其他软件的下载, 这过程就是我发送一个HTTP请求给服务器, 服务器返回一个带有下载链接的HTTP响应, 结果被运营商修改了响应里的下载链接, 这样我得到的就是换掉的链接了.
为啥运营商能劫持数据呢 ?
由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等), 那么运营商的网络设备就可以解析出你传输的数据报的内容, 并进行篡改.
其实不止运营商能得到用户与服务器交互的数据报, 黑客也可以.
HTTPS 就是在 HTTP 的基础上进行了加密, 进一步的来保证用户的信息安全.
加密方式
网络传输中不再直接传输明文了, 而是加密之后的 “密文”.
加密的方式有很多, 但是整体可以分成两大类: 对称加密 和 非对称加密
对称加密 :
只有一个密钥 key, 通过这个 key 可以将明文加密成密文, 同样的也可以用 key 将密文解密为明文.
对称加密的特点 : 计算起来比较快.
非对称加密 :
非对称加密要用到两个密钥, 一个叫做公钥(pub), 一个叫做私钥(pri). 公钥和私钥是配对的.
非对称加密的使用 :
通过私钥对明文加密, 变成密文, 再通过公钥对密文解密, 变成明文.
也可以反着来 : 通过公钥对明文加密, 变成密文, 再通过私钥对密文解密, 变成明文.
非对称加密缺点 : 运算速度非常慢,比对称加密要慢很多.
HTTPS 基本工作过程
注意 : 加密是针对 HTTP 的各种 header 和 body.
1. 仅使用对称密钥
注意 : 以上交互的前提是服务器存储了客户端的 key.
但实际上服务器所要服务的客户端非常多, 不可能将客户端的 key 都存储下来, 而客户端也不可能都使用一个 key, 如果所有客户端都使用一个 key, 那黑客就直接知道 key 了, 可以对数据报进行修改.
那咋办呢 ?
我们可以通过客户端自己生成一个 key, 在与服务器进行交互时, 提前告诉服务器我的 key 是多少, 然后客户端和服务器就用 key 来对数据加密解密.
那客户端总不能明文传输 key 吧, 这时候就要用到 非对称密钥 来对 key 加密了.
2. 引入非对称密钥对 key 进行加密
首先明确目标 : 客户端要将 key 安全送达到服务器, 不被黑客拿到.
先是客户端随机自己生成了一个 key, 服务器自己则有一对非对称密钥.
具体加密过程如下图 :
这样难道就真的安全吗? 黑客就没办法破解吗?
其实黑客可以通过欺骗手段来获取 key, 简称 “中间人攻击”.
原理如下 :
中间人攻击的关键在于客户端信任公钥, 同时这也是破解中间人攻击的关键.
3. 引入证书, 破解中间人攻击
证书就好比人的身份证, 作为这个网站的身份标识. 搭建一个 HTTPS 网站要在CA机构先申请一个证书. (类似于去公安局办个身份证).
证书可以理解为一个对象, 这个对象包含了 :
服务器的 url, 证书的有效期, 颁布证书的机构, 服务器自己的公钥 pub, 签名等等.
注意, 签名前面的都是明文展示的, 签名是进行加密了的.
这个签名其实就是一个校验和, 证书颁布机构会针对所有属性计算一个校验和, 然后用机构自己的私钥对其进行加密.
注意 : 每个机构的非对称密钥都不一样, 每个机构的公钥都内置在操作系统中, 不需要去机构拿.
客户端访问服务器时就询问服务器公钥, 服务器就直接把证书发给客户端.
客户端拿到证书后, 首先就是对证书进行校验.
- 得到初始的签名 : 客户端使用系统内置的权威机构的公钥, 对证书中的加密的签名进行解密, 得到初始签名(sum1)
- 计算现在签名 : 客户端使用同样的算法计算证书中的各种属性, 得到sum2.
- 比较两个sun值是否相同, 如果相同则说明是未被篡改的数据(安全), 如果不同, 则说明证书被篡改了(不安全), 客户端的浏览器就报错.
注意 : 这里为啥黑客就不能破解呢?
黑客也是可以破解签名的, 但是黑客不能对签名进行加密, 黑客没有机构的私钥, 既然无法加密, 那自然无法伪造签名了, 就不能破解了.
其实上述这一套 :
对称加密 + 非对称加密 + 证书, 也是一个协议, 叫 SSL 或者 TLS .
HTTPS 也就等于 HTTP + SSL.