我正在尝试使用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草案,并且看不出我做错了什么。
答案 0 :(得分:0)
虽然在Mozilla的关于编写WebSocket服务器的文章中没有明确说明,但sha1
必须是 raw binary digest
才能输出正确的websocket握手值。
根据PHP manual,sha1()
函数将$str
作为第一个参数,将布尔$raw_output
值作为第二个参数,它确定输出类型。默认情况下,$raw_output
设置为FALSE
,返回十六进制值。
因此,要在这种情况下获得正确的值,请将true
作为第二个参数传递给sha1()
:
$sha1 = sha1($concat, true);