7.1 HTTP的缺点
7.1.1 通信使用明文,可能会被窃听
- TCP/IP协议在通信线路上的任何一个地方,都可以看到传输的明文数据
- 比如路由器
- 比如代理服务器
- 即使加密后的数据,也会被人看到
- 如果别人破解了加密方法,数据也就丢了
解决之道
- 自己给实体内容加密,但加密后的内容还是可能被整个改掉
- SSL + TLS 可以构建一条安全的通信线路
- 实际也是蒙蔽状态,安全通信线路是啥意思?客户端和服务器直连不走代理服务器?如果要走代理服务器,它还不是照样可以拿到你的数据
7.1.2 不验证身份,可能遭遇伪装
- 任何人都可以发起请求,无法确认这个消息到底是来自谁的
- 有可能被
DoS攻击
解决之道
- SSL还提供证书,用于确定通信方
7.1.3 无法验证报文完整性,可能会被篡改
- 经过中间代理/路由器/热点的时候,信息可能会被调包
- 导致
MITM中间人攻击
解决之道
- 使用MD5和SHA1检验,但检验码可能整个被调包,并且需要用户手动验证
- SSL可以避免这个问题,但具体怎么避免这个问题的,我还是说不清楚
7.2 HTTPS
7.2.1 HTTP + 加密 + 认证 + 完整性保护 = HTTPS
添加了加密及认证机制的HTTP就是HTTPS
7.2.2 HTTPS是身披SSL外壳的HTTP
- HTTPS并非应用层的一种新协议
- 只是替换了HTTP通信接口的部分功能
- 有点类似于在HTTP和TCP之间加了一个SSL层,但它还是属于应用层的
7.2.3 加密技术
为了解决报文明文传输的问题,就出现了加密技术
- 共享加密
- 加密和解密使用同一个密钥
- 【问题】密钥丢了,任何人都可以解密了
- 我加密后,如果把密钥放在内容一起发给你,别人就很容易拿到内容和钥匙...
- 公开加密
- 加密和解密的钥匙不一样
- 我先定义好私钥和公钥,再把公钥发给你,你用公钥加密后把内容发给我.
- 这样别人就只能拿到内容而没有钥匙
- 如果想通过公钥反推内容,除非等量子计算机出来,所以相对安全
- 【问题】但是运算速度非常慢
- HTTPS采用的混合加密
- 在传递共享加密密钥的时候,使用公开加密
- 后续的内容都使用共享加密
- 这样即保证了安全性,又在速度上得到了保障
- 【问题】如果传输过程中,公钥被篡改了,也会导致后续通信失败
7.2.4 证明公开密钥正确性的证书
为了解决公钥被篡改的问题,就出现了证书
- 这一切建立的前提是对证书机构的绝对信任,如果证书机构出问题了,也就不安全了
证书验证公钥正确性的流程
- 认证机构会把自己的公钥(比如jigou001)内置到浏览器里面
- 网站主在认证机构注册
- 认证机构给网站主颁发一个公钥证书(比如jigou001-ranwawa001)
- 用户访问网站,网站会把公钥(jigou001-ranwawa001)传给用户
- 用户拿到网站公钥后,会用机构的公钥对网站的公钥加密,然后传递给认证机构
- 认证机构验证这个网站公钥是不是在我这里注册过,如果是,返回ok
- 用户收到认证机构的ok后,就把请求信息加密后发给服务器开始通信,反之则提示有可能被中毒了
- 网站主收到用户发来的信息后,就用自己的私钥来解密.
证明组织真实性的EV SSL证书
- 可以防止用户被钓鱼攻击
- 就是360/腾讯管家搞的那些一年收几千块的认证,没卵用
- 主要是用户对这个没什么感知
用于确认客户端身份的客户端证书,像网银的u盘证书一样
- 一是要用户安装太麻烦
- 再就是要付费
- 另外也只能证明用户身份,也不能证明是不是用户本人,所以没多大用处
自签名证书
- 使用OpenSSL开源程序,自己给自己生成证书
- 但是这种因为根证书没内置在浏览器里,所以可能会警告,
中级认证机构的证书的价值
- 因为只有一些小浏览器会内置他们的根证书
- 而像Chrome这种大浏览器不会内置,所以还是可能会警告
- 所以国内那些认证几乎可以说没啥卵用,像之前12306的证书在Chrome下面提示警告,估计就是这个原因
7.2.5 HTTPS的安全通信机制
- 确认加密组件
- 客户端向服务端发送握手请求,包含相关HTTPS信息
- 服务端确认
- 服务端返回公钥
- 服务端确认结束
- 确认双方公钥
- 客户端发送公钥
- 客户端发送加密数据
- 客户端确认结束
- 确认双方公钥
- 服务端解密用户数据
- 服务端确认结束
- 开始HTTP交换数据
- 结束链接
- 加密/解密的时候会消耗更多的内存和CPU资源,导致处理速度变慢
- 握手次数增多,除了HTTP外还要进行SSL通信,导致通信变慢