MST

星途 面试题库

面试题:网络编程之WebSocket握手安全性

在WebSocket握手过程中,如何通过Sec - WebSocket - Key和Sec - WebSocket - Accept字段来确保握手的安全性和合法性?请阐述其原理和计算过程。
26.1万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

原理

  1. Sec - WebSocket - Key:客户端在握手请求中发送Sec - WebSocket - Key字段,它是一个随机生成的Base64编码字符串。其目的是防止普通HTTP请求伪装成WebSocket请求,因为普通HTTP请求不会包含符合规范的Sec - WebSocket - Key
  2. Sec - WebSocket - Accept:服务端接收到握手请求后,根据Sec - WebSocket - Key计算出Sec - WebSocket - Accept字段的值,并在握手响应中返回。客户端收到响应后,会验证返回的Sec - WebSocket - Accept是否正确,以此确保服务端是合法的WebSocket服务端。

计算过程

  1. 服务端计算步骤
    • 服务端获取客户端发送的Sec - WebSocket - Key
    • Sec - WebSocket - Key与固定字符串258EAFA5 - E914 - 47DA - 95CA - C5AB0DC85B11拼接在一起。例如,如果Sec - WebSocket - KeydGhlIHNhbXBsZSBub25jZQ==,拼接后为dGhlIHNhbXBsZSBub25jZQ==258EAFA5 - E914 - 47DA - 95CA - C5AB0DC85B11
    • 对拼接后的字符串进行SHA - 1哈希运算,得到一个20字节的哈希值。
    • 将哈希值进行Base64编码,得到最终的Sec - WebSocket - Accept的值。例如,经过上述步骤计算后,可能得到s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  2. 客户端验证步骤
    • 客户端收到服务端返回的Sec - WebSocket - Accept
    • 客户端使用与服务端相同的计算方法,根据自己发送的Sec - WebSocket - Key计算出一个预期的Sec - WebSocket - Accept值。
    • 将计算出的预期值与服务端返回的Sec - WebSocket - Accept值进行对比,如果两者一致,则握手合法,WebSocket连接可以建立;否则,握手失败。