2015-09-19 3 views
1

На странице RFC6455 на стр. 7 и 8 вы можете увидеть, как сервер обрабатывает клиентское значение Sec-WebSocket-Key (объединяет персональный GUID, используя SHA1 и возвращающую закодированную строку base64).WebSocket: Как клиент получает руководство?

Я предполагаю, что это используется по соображениям безопасности. Если клиент будет знать GUID серверов, он может сделать тот же расчет и сравнить ответ с его личным результатом для идентификации сервера.

Но как клиент узнает о GUID серверов? или есть ли другая причина для этого алгоритма?

ответ

4

Чтобы доказать, что рукопожатие было получено, сервер должен принять две части информации и объединить их, чтобы сформировать ответ. первая часть информации взята из | Sec-WebSocket-Key | поле заголовка в клиентском рукопожатия:

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 

В частности, если, как в приведенном выше примере, | Sec-WebSocket-Key |
поле заголовка имел значение "dGhlIHNhbXBsZSBub25jZQ ==", сервер
бы конкатенировать строку "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
, чтобы сформировать строку «dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CA-
C5AB0DC85B11 ". Сервер будет принимать на SHA-1 хеш этого,
дает значение 0xb3 0x7A 0x4F 0x2c 0xc0 0x62 0x4F 0x16 0x90 0xf6
0x46 0x06 0x38 0x59 0xcf 0x45 0xb2 0xbe 0xc4 0xea. Это значение равно
, затем закодировано base64 (см. Раздел 4 документа [RFC4648]), чтобы получить значение
"s3pPLMBiTxaQ9kYGzzhZRbK + xOo =". Это значение будет затем отражено в
| Sec-WebSocket-Accept | поле заголовка.

Клиент не должен знать идентификатор GUID. Это механизм для предотвращения повторного использования прокси-сервера средствами websocket.

https://en.wikipedia.org/wiki/WebSocket#Protocol_handshake

+0

Это, вероятно, стоит упомянуть терминальную команду, используемую для генерации является 'эхо -n "dGhlIHNhbXBsZSBub25jZQ == 258EAFA5-E914-47DA-95CA-C5AB0DC85B11" | openssl dgst -binary -sha1 | openssl base64'. Кроме того, промежуточная сумма sha1 в шестнадцатеричном формате является 'b37a4f2cc0624f1690f64606cf385945b2bec4ea', но учтите, что вы должны преобразовать ее в двоичный код до кодировки base64. – dzh

Смежные вопросы