图解 HTTP 三(确保 web 安全的 HTTPS)

413 阅读5分钟

情不敢至深,恐大梦一场。 —— 夏吉尔硕

起步:

HTTP 协议会存在消息劫持和身份伪装等安全问题,而使用 HTTPS 则可以有效防止这些问题。

HTTP 的缺点

  • 通信使用明文(不加密),内容有可能被窃听
  • 不验证通信方身份,因此可能遭遇伪装。
  • 无法证明报文完整,所以有可能被篡改

通信使用明文,可能被窃听

  • 通信不加密
    • 因为按 TCP/IP 协议族工作机制,通信内容在所有通信线路都可能被窥视。
  • 通信加密
    • 加密处理的通信也会被窥视通信内容,只是可能无法被破解报文信息含义。

注:互联网上的任何角落都存在通信内容被窃听的风险

通信加密

  • HTTP 协议本身没有加密机制,但可以与 SSL(Secure Socket Layer)组合使用

  • SSL 建立安全通信线路,然后进行 HTTP 通信

  • 这种与 SSL 组合的 HTTP 被称之为 HTTPS(HTTP Secure,超文本传输安全协议)

验证通信方身份

  • HTTP 协议通信时,不会确认通信方

  • 而服务器对请求者也是来者不拒,都会返回响应

  • 不确认通信方则会存在以下隐患

    • 有可能遭遇伪装的 web 服务器
    • 有可能遭遇伪装的客户端
    • 无法确定通信的对方是否具备访问权限
    • 重点:因无意义请求也会接收,容易遭遇 DoS 攻击(拒绝服务攻击)
  • 查明对方证书

    • 以上可知用 HTTP 协议无法确定通信方
    • 使用 SSL 可用于确定对方身份
    • 证书有可信任第三方颁发,可证明客户端或服务端实际存在

无法确认报文完整性,则容易被篡改

  • HTTP 协议无法证明通信的报文完整性,所以具有风险性
  • 比如:发出请求,从某服务器接收到的网页文件,有可能是篡改过的
  • 遭攻击者拦截并篡改内容的攻击称为中间人攻击

HTTP+ 加密 + 认证 + 完整性保护

  • 把添加了加密及认证机制的 HTTP 称为 HTTPS
  • 同时在浏览器访问中也改用 https://,并且带有锁 🔒 标记
  • HTTPS 只是身披 SSL 外壳的 HTTP 而已
    • 通常,HTTP 直接和 TCP 通信。
    • 使用 SSL 时,变成先和 SSL 通信,再由 SSL 和 TCP 通信
  • 采用 SSL 后,HTTP 就拥有了加密,证书,报文完整性保护功能
  • SSL 是当今世界上应用最为广泛的网络安全技术。

公开密钥加密技术

  • 公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。
  • 如何应用
    • 发送密文的一方,使用对方的公开密钥进行加密处理。
    • 接收加密信息的乙方,再使用自己的私有密钥进行解密。
  • 外界根据密文和公开密钥,恢复到信息原文是异常困难的,因为解密过程就是在对离散对数进行求值,这很难办到。

HTTPS 采用混合加密方式

  • HTTPS 采用共享密钥加密(对称密钥加密)+公开密钥加密(非对称密钥加密)

  • (公开密钥加密与共享密钥加密相比,其处理速度要慢)

  • 公开密钥使用无法确认是货真价实的公开密钥

    • 解决方案,使用数字证书认证机构和其他机关颁发的公开密钥证书。
  • HTTPS 要比 HTTP 慢

    • HTTPS 进行加解密会消耗 CPU 和内容等硬件资源
    • SSL 通信会消耗部分网络资源

为什么不一直使用 HTTPS?

  • 使用 HTTPS 通信需购买证书(金钱花费)
  • 加密通信会消耗更多 CPU 和内存资源
  • 计算机会因 HTTPS 通信而减少能够处理请求的数量
  • 因此,只有敏感数据才使用 HTTPS 加密通信,而且只针对部分内容,以节约资源

确认访问者身份——表单验证

Session 管理及 Cookie 应用

基于表单认证是通过服务器端的 Web 应用,将客户端发送过来 的用户 ID 和密码与之前登录过的信息做匹配来进行认证的

  • 一般使用 Cookie 管理 Session,弥补 HTTP 协议中无状态管理功能

  • 根据图上可知,操作步骤如下

  步骤 1: 客户端把用户 ID 和密码等登录信息放入报文的实体部分,通常以 POST 方法使用 HTTPS通信来进行数据的发送。

  步骤 2: 服务器会发放用以识别用户的 Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID 绑定后记录在服务器端。
    补充:客户端返回响应时,会在首部字段 Set-Cookie 内写入 SessionID(如 PHPSESSID=028a8c…)

  步骤 3A:客户端接收到从服务器端发来的 Session ID 后,会将其作为Cookie 保存在本地。
    B:下次向服务器发送请求时,浏览器会自动发送Cookie,所以 Session ID 也随之发送到服务器。
    C:服务器端可通过验证接收到的 Session ID 识别用户和其认证状态。

总结:

HTTPS虽然各方面都优于HTTP,但出于资源占用影响效率和成本考虑,在实际中的应用并不完全是HTTPS,而是采用HTTP与HTTPS混合使用的方式

或许你对以下内容也感兴趣