2017-08-29 117 views
0

我正在嘗試編寫一段代碼,它將爲web套接字連接生成Sec-WebSocket-Accept值。我從收集資源在線(即MDN)是你:在PHP中如何實現WebSocket握手?

  1. 將字符串,客戶端送你Sec-WebSocket-Key到GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11);

  2. 取這個串聯結果的SHA-1散列;

  3. 轉換的,其結果基地64

所以,如果我理解正確此,相應的PHP代碼如下:

base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); 

然而,這是不正確的。它與MDN上顯示的示例不匹配(即,在MDN上,值爲dGhlIHNhbXBsZSBub25jZQ==的WebSocket密鑰應返回s3pPLMBiTxaQ9kYGzzhZRbK+xOo=,但使用我編寫的PHP代碼,它返回YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==)。

我在這裏做了什麼不對?

回答

1

sha1()函數接受一個可選的第二個布爾參數,它使用20個字符的二進制形式(而不是40個字符的十六進制形式)返回原始SHA-1摘要(請參閱PHP Manual)。

WebSocket握手需要原始二進制格式。因此,您需要將第二個參數添加到sha1()函數中。

base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true)); 
+0

這就解決了這個問題。謝謝。 – Toastrackenigma