在WebSocket協議中,握手過程中的Sec-WebSocket-Key是一個由客戶端生成的隨機字符串,用于安全地建立WebSocket連接。這個Sec-WebSocket-Key是基于Base64編碼的,并且通常由客戶端在WebSocket握手請求的頭部字段中發送。根據WebSocket協議規范(RFC 6455),Sec-WebSocket-Key的長度應該是16字節(128位)。
生成過程
客戶端生成:客戶端首先生成一個隨機的16字節(128位)的密鑰。這個密鑰可以是任何隨機生成的字節序列。
Base64編碼:然后,這個16字節的隨機數被編碼為Base64字符串。Base64編碼會將原始的二進制數據轉換為ASCII字符串,使得這些數據可以通過文本傳輸。由于16字節可以表示為128位,轉換成Base64編碼后,長度會增加大約33%。因此,編碼后的字符串長度大約為24字節(在大多數實現中,不包括填充字符=)。
發送:客戶端將這個Base64編碼的字符串放在HTTP頭部字段Sec-WebSocket-Key中,并發送給服務器。
示例
例如,一個16字節的隨機數(二進制表示)可能是:
0xb3 0x7a 0x4f 0x2c 0xc0 0x65 0x22 0xf9 0x39 0x87 0x79 0x09 0xb4 0x84 0x5e 0xf8
將其轉換為Base64編碼后,得到:
b7pPwmFmJSIvnxmZjRg=
這個Base64字符串就是Sec-WebSocket-Key的值,長度大約為24字節。
注意事項
填充:在一些實現中,Base64編碼后的字符串可能包含=字符作為填充,以確保編碼后的字符串長度是4的倍數。但在大多數情況下,WebSocket握手請求中使用的Base64編碼不包括這些填充字符。
服務器響應:服務器在接收到客戶端的Sec-WebSocket-Key后,會生成一個類似的響應頭部字段Sec-WebSocket-Accept,該字段的值是通過將客戶端的Sec-WebSocket-Key值與一個特定的GUID字符串(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)進行連接,然后對整個結果進行SHA-1哈希,最后將哈希值再進行Base64編碼得到的。這個過程確保了雙方都能安全地驗證對方的身份,并建立加密的WebSocket連接。
總結,Sec-WebSocket-Key應該是16字節(128位),但在實際應用中通過Base64編碼后通常表示為大約24字節的字符串。
SHA-1生成的摘要長度為?20字節?(160位),通常以40個十六進制字符表示。 ?
核心信息
- ?160位?:SHA-1算法將輸入數據轉換為固定長度的160位二進制輸出,對應20字節。 ?
- ?十六進制表示?:由于每個十六進制字符占用4位,因此最終呈現為40個十六進制字符(如
abcdef...
)。 ? - ?安全性問題?:由于存在安全漏洞,SHA-1已被逐步淘汰,當前更推薦使用SHA-2或SHA-3算法。