在PHP中如何实现WebSocket握手?
问题描述:
我正在尝试编写一段代码,它将为web套接字连接生成Sec-WebSocket-Accept
值。我从收集资源在线(即MDN)是你:在PHP中如何实现WebSocket握手?
将字符串,客户端送你
Sec-WebSocket-Key
到GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11
);取这个串联结果的SHA-1散列;
转换的,其结果基地64
所以,如果我理解正确此,相应的PHP代码如下:
base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
然而,这是不正确的。它与MDN上显示的示例不匹配(即,在MDN上,值为dGhlIHNhbXBsZSBub25jZQ==
的WebSocket密钥应返回s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
,但使用我编写的PHP代码,它返回YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
)。
我在这里做了什么不对?
答
sha1()
函数接受一个可选的第二个布尔参数,它使用20个字符的二进制形式(而不是40个字符的十六进制形式)返回原始SHA-1摘要(请参阅PHP Manual)。
WebSocket握手需要原始二进制格式。因此,您需要将第二个参数添加到sha1()
函数中。
base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));
这就解决了这个问题。谢谢。 – Toastrackenigma