Websockets - Sec-WebSocket-Accept несоответствие - PullRequest
1 голос
/ 23 февраля 2012

Я пишу сервер websocket на C ++ и у меня проблема с вычислением ключа Sec-WebSocket-Accept.Я протестировал sha1, и он генерирует правильное значение (я взял строку из примера из Википедии и получил тот же хэш), а также нашел онлайн-конвертер base64 для тестирования второй части, и, похоже, он работает правильно.Но, как я вижу по другим вопросам, моя строка слишком длинная.

  std::string secKey =  readHeader(buffer,n,"Sec-WebSocket-Key");
  std::string magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

  secKey.append(magic);
  unsigned char hash[20];
  char hexstring[41];

  sha1::calc(secKey.c_str(),secKey.length(),hash);
  sha1::toHexString(hash,hexstring);
  std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hexstring) ,strlen(hexstring));

For secKey = "4aRdFZG5uYrEUw8dsNLW6g ==" Я получаю закодированное значение "YTYwZWRlMjQ4NWFhNzJiYmRjZTQ5ODM1NNJWEWNWJWNWWWJWNJWJWNWJWNWJWNJWNWJWNW0WMNNjjwjw

1 Ответ

2 голосов
/ 23 февраля 2012

Я думаю, что вы можете пропустить строку toHexString, а base64 вместо этого закодировать 20-байтовый хеш.

sha1::calc(secKey.c_str(),secKey.length(),hash);
std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash), 20);

Это то, что мой C ++ сервер делает, и рукопожатия завершаются успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...