PHP websockets - 不正确的Sec-WebSocket-Accept

时间:2018-03-10 04:22:53

标签: php websocket base64 sha1

我正在尝试使用PHP websockets创建服务器应用程序。 我写了这个脚本来帮助详细说明我的问题。这里的正确值是在Mozilla的WebSocket教程中提供的。

<?php
     define('GUID','258EAFA5-E914-47DA-95CA-C5AB0DC85B11');
     $hypkey = "dGhlIHNhbXBsZSBub25jZQ==";
     $concat = $hypkey . GUID;
     $sha1 = sha1($concat); 
     $base64 = base64_encode($sha1);

     echo $hypkey . "\n" . $concat . "\n" . $sha1 . "\n" . $base64;


    if ($base64 == "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=")
        echo "all is right";

?>

此脚本的输出是

dGhlIHNhbXBsZSBub25jZQ==
dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
b37a4f2cc0624f1690f64606cf385945b2bec4ea
ZEdobElITmhiWEJzWlNCdWIyNWpaUT09MjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjEx

正如你所看到的,如果它是正确的,最后一行将是“一切都是正确的”,所以我在某个地方出错了。我已多次重读本教程的这一部分和Websocket草案,并且看不出我做错了什么。

1 个答案:

答案 0 :(得分:0)

虽然在Mozilla的关于编写WebSocket服务器的文章中没有明确说明,但sha1必须是 raw binary digest 才能输出正确的websocket握手值。

根据PHP manualsha1()函数将$str作为第一个参数,将布尔$raw_output值作为第二个参数,它确定输出类型。默认情况下,$raw_output设置为FALSE,返回十六进制值。

因此,要在这种情况下获得正确的值,请将true作为第二个参数传递给sha1()

$sha1 = sha1($concat, true);