【问题标题】:PHP websockets - incorrect Sec-WebSocket-AcceptPHP websockets - 不正确的Sec-WebSocket-Accept
【发布时间】:2018-03-10 04:22:53
【问题描述】:

我正在尝试使用 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草稿我已经重读了好几遍,没看出我做错了什么。

【问题讨论】:

    标签: php websocket base64 sha1


    【解决方案1】:

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

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

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

    $sha1 = sha1($concat, true);

    【讨论】:

    • 这得到了正确的答案。我怎么知道,在我阅读了所有文档之后,它只是说获取 sha1 哈希......它从未说过它必须是原始的!
    • @A.Johnston 是的,绝对没有在任何地方明确说明!实际上,我最终不得不阅读 writing a WebSocket server in Java 上的 Mozilla 教程才能找到此代码:.printBase64Binary( MessageDigest .getInstance("SHA-1") .digest((match.group(1) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11") .getBytes("UTF-8"))) + "\r\n\r\n") 获取摘要。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多