PHP base64编码删除错误答案

时间:2015-06-09 10:38:42

标签: php websocket base64

我目前正在开发一个必须实现网络套接字服务器的网站。我正在使用PHP来制作服务器。我从客户端响应中提取了Sec-websocket-key,然后使用PHP sha1()命令对其进行了哈希处理。

问题在于,当我想要base64_encode时,它会给出一个错误的接受键。 base64_encode命令有变化吗?

感谢您的回答!

这只是一个测试代码,它不允许多个客户端:

$address = "127.0.0.1";
$port = 9000;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port);
socket_listen($sock);

$client = socket_accept($sock);

$handshake = Array();

$response = socket_read($client, 1024);

$handshake = split("\r\n", $response);

$socketKey = split(" ", $handshake[11]);

$rawAccept =  socketKey[1] . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

$rawAccept = str_replace(" ", "", $rawAccept);

$rawSha1Accept = sha1($rawAccept);

$accept = base64_encode($rawSha1Accept);

$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
            "Upgrade: websocket\r\n" .
            "Connection: Upgrade\r\n" .
            "Sec-WebSocket-Accept: $accept\r\n\r\n";

socket_write($client, $upgrade, 1024);

2 个答案:

答案 0 :(得分:0)

我认为错误可能就在这一行:

$rawAccept =  socketKey[1] . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

我认为socketKey [1]应该只是socketKey,但是我在下面编写了一些未经测试的代码,它们可以帮助您了解如何获取密钥并创建正确的接受密钥。

$address = "127.0.0.1";
$port = 9000;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port);
socket_listen($sock);

$client = socket_accept($sock);

$response = socket_read($client, 1024);

if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $response, $match))
{
    $key = $match[1];
}

$sha = sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true);
$acccept = base64_encode($sha);

$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
        "Upgrade: websocket\r\n" .
        "Connection: Upgrade\r\n" .
        "Sec-WebSocket-Accept: $accept\r\n\r\n";

socket_write($client, $upgrade, 1024);

答案 1 :(得分:0)

函数sha1()已经对哈希值进行编码,因此您应该在编码之前计算二进制哈希:

$rawSha1Accept = sha1($rawAccept, true); // Note the second parameter
$accept = base64_encode($rawSha1Accept);