HTTP-安全篇

HTTP-安全篇

      • HTTPS/SSL/TLS
      • 对称解密和非对称加密
      • TLS连接过程

HTTP存在的一些缺点:

  • 无状态:通过加入Cookie后得到解决
  • 明文
  • 不安全

HTTPS/SSL/TLS

HTTP在整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求/响应报文,数据不具有可信性。
通常任务,如果通信过程具备了四个特性,即机密性,完整性,身份认证和不可否认。

  • 机密性:是指对数据的保密,只能由可信的人访问,对其他人是不可见的秘密。
  • 完整性:数据在传输过程中没有被篡改,
  • 身份认证:确认对方的真实身份,
  • 不可否认:不能否认已经发生过的数据传输行为。
    HTTPS 默认端口号443
    HTTPS把HTTP下层的传输层协议由TCP/IP换成了SSL/TLS,让HTTP运行在安全的SSL/TLS协议上,收发报文不再使用Socket API 而是调用专门的安全接口。
    HTTP-安全篇_第1张图片
    SSL/TLS

SSL即安全套接层,在OSI模型处于第五层(会话层),1999年更名为TLS(传输层安全)

OpenSSL是一个开源密码学程序库和工具包,几乎支持所有公开的加密算法和协议。

对称解密和非对称加密

实现机密最常用的手段就是“加密”,

对称机密:指加密和解密时使用的密钥是同一个,是“对称的”,
TLS中常用的对称加密算法有:RC4、DES、3DES、AES、ChaCha20等,但前三种都被认为是不安全的,常用的只有AES和ChaCha20…

AES:高级加密标准,密钥长度可以是128、192、256
ChaCha20:是谷歌设计的一种加密算法,密钥长度固定为256,

对称算法还有”分组模式“,可以让算法用固定长度的密钥加密任意长度的明文,把小秘密(密钥)转化为大秘密(密文)。

TLS密码套件中定义的对称加密算法
比如:AES128-GCM,意思是密钥长度为128位的AES算法,使用的分组模式是GCM,ChaCha20-Poly1305的意思是ChaCha20算法,使用的分组模式是Poly1305.

非对称加密:
有两个密钥: 一个公钥,一个私钥,公钥可以公开给任何人使用,而私钥必须严格保密。
公钥和私钥有个特别的单向性,都可以用来加密解密,但是公钥加密后只能用私钥解密,反过来私钥加密后只能用公钥解密。
非对称加密可以解决“密钥交换”的问题。网站秘密保管私钥,在网上任意分发公钥,要登录网站只要公钥加密就可以,密文只能由私钥持有者才能解密。
RSA非堆成加密,它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,

当前TLS使用的是混合加密的方式:

  • 在通信刚开始的时候使用非对称加密,如RSA等解决密钥交换的问题
  • 然后用随机数产生对称算法使用的“会话密钥”,再用公钥加密,
  • 对方拿到密文后再用私钥解密,取出会话密钥,这样双方就实现了对称密钥的安全交换,后续全部使用对称加密。
    HTTP-安全篇_第2张图片

TLS连接过程

在浏览器中键入https开头的uri后,浏览器首先要从URI里提取出协议名和域名,因为协议名“https”,所以浏览器知道端口号是默认的443,然后用DNS解析域名,得到目标的IP地址,然后就可以使用三次握手与网站建立TCP连接,在HTTP协议中,建立连接后,浏览器会立即发送请求报文,HTTPS还需要建立另一个握手过程,在TCP上建立安全连接,之后才是收发HTTP报文。

TLS协议的组成
TLS包含几个子协议,比较常用的有记录协议 ,警报协议,握手协议,变更密码规范协议等。

  • 记录协议:规定了TLS收发数据的基本单位:record,所有其他子协议都需要通过记录协议发出,但多个记录数据可以在TCP包里一次性发出,也不需要像TCP那样返回ACK。
  • 警报协议:向对方发出警报消息,类似HTTP状态码,protocol_version 就是不支持旧版本,bad_certificate 就是证书有问题,收到警报后另一方可以选择继续,也可以立即终止连接。
  • 握手协议:浏览器和服务器会在握手过程中协商 TLS 版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统
  • 变更密码规范协议:通知,告诉对方,后续的数据都将使用加密保护。

连接过程:

  1. 在 TCP 建立连接之后,浏览器会首先发一个“Client Hello”消息,也就是跟服务器“打招呼”。里面有客户端的版本号、支持的密码套件,还有一个随机数(ClientRandom),用于后续生成会话密钥
  2. 服务器收到“Client Hello”后,会返回一个“Server Hello”消息。把版本号对一下,也给出一个随机数(Server Random),然后从客户端的列表里选一个作为本次通信使用的密码套件
  3. 服务器为了证明自己的身份,就把证书也发给了客户端(Server Certificate)
  4. 如果服务器选择了 ECDHE 算法,它会在证书后发送“Server Key Exchange”消息,里面是椭圆曲线的公钥(Server Params),用来实现密钥交换算法,再加上自己的私钥签名认证,之后是“Server Hello Done”消息。
  5. 这样第一个消息往返就结束了(两个 TCP 包),结果是客户端和服务器通过明文共享了三个信息:Client Random、Server Random 和 Server Params。
    此时,客户端拿到了服务器的证书,然后开始走证书链逐级验证,确认证书的真实性,再用证书公钥验证签名,就确认了服务器的身份。
  6. 客户端按照密码套件的要求,也生成一个椭圆曲线的公钥(Client Params),用“Client Key Exchange”消息发给服务器。
    客户端和服务器手里都拿到了密钥交换算法的两个参数(Client Params、ServerParams),就用 ECDHE 算法计算,算出了一个新的东西,叫“Pre-Master”,其实也是一个随机数。
    在客户端和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master。用这三个作为原始材料,就可以生成用于加密会 话的主密钥,叫“MasterSecret”
  7. 有了主密钥和派生的会话密钥,握手就快结束了。客户端发一个“Change CipherSpec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证
  8. 服务器也是同样的操作,发“Change Cipher Spec”和“Finished”消息,双方都验证加密解密 OK,握手正式结束,后面就收发被加密的 HTTP 请求和响应了.

总结:

  • HTTPS 协议会先与服务器执行 TCP 握手,然后执行 TLS 握手,才能建立安全连接;
  • 握手的目标是安全地交换对称密钥,需要三个随机数,第三个随机数“Pre-Master”必须加密传输,绝对不能让黑客破解;
  • “Hello”消息交换随机数,“Key Exchange”消息交换“Pre-Master”;
  • “Change Cipher Spec”之前传输的都是明文,之后都是对称密钥加密的密文

TLS1.3 里只保留了 AES、ChaCha20 对称加密算法,分组模式只能用 AEAD 的 GCM、CCM 和 Poly1305,摘要算法只能用 SHA256、SHA384,密钥交换算法只有 ECDHE 和 DHE,椭圆曲线也被“砍”到只剩 P-256 和 x25519 等 5种。

你可能感兴趣的:(网络)